专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

进程通信的五种普通方法

  第一种:通过自定义消息来实现
  SendMessage和PostMessage最大的区别:
  SendMessage:发送的消息不进入消息队列,而是将指定的消息发送到一个或多个窗口,所以会等待对方的处理,直到对方接收到了才返回
  PostMessage:发送的消息进入到消息队列,所以不会等待对方的处理,直接放到消息队列就返回
  hmod和dwThreadId参数说明:
  如果需要设置局部钩子(作用范围:单一的进程),那么hmod参数为0,dwThreadId设置为需要钩住的线程的ID。
  如果需要设置全局钩子(作用范围:所有有效进程),那么hmod参数为模块句柄(钩子的回调函数需要在DLL中),dwThreadId设置为0。includeWindows。hincludecstdioincludeTlHelp32。hintmain(intargc,charargv〔〕){HWNDhwnd;HMODULEhModule;HWNDhWnd;HHOOKgHook;hModuleLoadLibrary(LD:VisualStudioRepos2013进程通信DebugWin32Project1。dll);typedefLRESULT(CALLBACKpWndProc)(intnCode,WPARAMwParam,LPARAMlParam);pWndProcWndProc;WndProc(pWndProc)GetProcAddress(hModule,WndProc12);hWndFindWindow(L32770,LPEDialog);DWORDdwThreadIdGetWindowThreadProcessId(hWnd,NULL);gHookSetWindowsHookEx(WHCALLWNDPROC,WndProc,hModule,dwThreadId);if(NULLgHook){MessageBox(NULL,L安装钩子失败,L提示,MBOKCANCEL);}SendMessage(hWnd,WMUSER100,0,100);PostMessage(hWnd,WMUSER100,0,100);printf(d,GetLastError());return0;}
  有个坑:虽然自己没有测试真实性,自己猜想的PostMessage不起作用的原因是对方进程中的消息循环机制中就没有要自己HOOK的循环消息的类型,这时候将该消息放入消息队列当程序本身取出该消息的时候发送给系统,系统通过调用就无法识别要发送给谁,所以说可能如果本身有定义的话应该是可以用PostMessage来实现的,然后说下为什么SendMessage可以实现,因为自己查询了SendMessage该函数是直接将消息发送给窗口的,所以识别的过程就过去省略,直接发送给,以上都当自己放屁发现自己解释的是错的,为什么不删掉?以后当自己看到这里的时候,可以再次回想下,继续思考,重新把它的解释填上!!!
  DLL编写如下:includestdafx。hincludeTTTT。hincludecstdiopragmacomment(linker,SECTION:。share,RWS)pragmadataseg(。share)HHOOKgHook0;这几句代码申明gHook被多个进程间共享pragmadataseg()externCdeclspec(dllexport)LRESULTCALLBACKWndProc(intnCode,WPARAMwParam,LPARAMlParam){if(nCodeHCACTION){TCHARszWindowText〔〕TEXT(HookTest);PCWPSTRUCTpcw(PCWPSTRUCT)lParam;if(pcwmessageWMUSER100pcwlParam100){MessageBox(0,LWOW,LWOW,0);}}returnCallNextHookEx(gHook,nCode,wParam,lParam);}第二种:通过文件映射创建的共享内存来实现
  服务端的代码:includeWindows。hincludecstdiointmain(){HANDLEhMapping;此函数为指定的文件创建一个命名或未命名的文件映射对象hMappingCreateFileMapping(INVALIDHANDLEVALUE,NULL,PAGEREADWRITE,0,0x1000,LMyMapping);if(hMappingNULL){printf(CreateFileMappingFailed,theerrorisd,GetLastError());}LPVOIDpMapMapViewOfFile(hMapping,FILEMAPALLACCESS,0,0,0x1000);if(pMapNULL){printf(MapViewOfFileFailed,theerrorisd,GetLastError());}printf(初始打印:pMap:x,(PDWORD)pMap);getchar();printf(二次打印:pMap:x,(PDWORD)pMap);getchar();UnmapViewOfFile(pMap);CloseHandle(hMapping);}
  客户端的代码:includeWindows。hincludecstdiointmain(){HANDLEhMapping;此函数为指定的文件创建一个命名或未命名的文件映射对象hMappingCreateFileMapping(INVALIDHANDLEVALUE,NULL,PAGEREADWRITE,0,0x1000,LMyMapping);if(hMappingNULL){printf(CreateFileMappingFailed,theerrorisd,GetLastError());}LPVOIDpMapMapViewOfFile(hMapping,FILEMAPALLACCESS,0,0,0x1000);if(pMapNULL){printf(MapViewOfFileFailed,theerrorisd,GetLastError());}(PDWORD)pMap0x12345678;printf(初始打印:x,(PDWORD)pMap);getchar();UnmapViewOfFile(pMap);CloseHandle(hMapping);}
  第三种方法:匿名管道实现父子进程通信
  需要注意的是:父进程创建子进程的时候,关于STARTUPINFO的结构体参数需要比正常多几个如下参数,自己理解来看就是把当前父进程的输入输出流都写到对应的读写管道中si。dwFlagsSTARTFUSESTDHANDLES;si。hStdInputhPipeWrite;si。hStdOutputhPipeRead;si。hStdErrorGetStdHandle(STDERRORHANDLE);
  父进程:includeWindows。hincludecstdiointmain(){HANDLEhPipeRead;HANDLEhPipeWrite;SECURITYATTRIBUTESsa;sa。bInheritHandleTRUE;sa。lpSecurityDescriptorNULL;sa。nLengthsizeof(SECURITYATTRIBUTES);BOOLbRetCreatePipe(hPipeRead,hPipeWrite,sa,0);if(!bRet){return1;}STARTUPINFOsi{0};PROCESSINFORMATIONpi;si。cbsizeof(STARTUPINFO);si。dwFlagsSTARTFUSESTDHANDLES;si。hStdInputhPipeWrite;si。hStdOutputhPipeRead;si。hStdErrorGetStdHandle(STDERRORHANDLE);WCHARwszReadBuffer〔MAXPATH〕;WCHARwszWriteBuffer〔MAXPATH〕Lhttp:zpchcbd。com;DWORDdwReadBytes;DWORDdwWriteBytes;写if(WriteFile(hPipeWrite,(LPVOID)wszWriteBuffer,MAXPATH,dwWriteBytes,NULL)){wprintf(LTopProcesss,wszWriteBuffer);}CreateProcess(LD:VisualStudioRepos2013进程通信Debugtest。exe,NULL,NULL,NULL,TRUE,0,NULL,NULL,si,pi);while(true){if(ReadFile(hPipeRead,(LPVOID)wszReadBuffer,MAXPATH,dwReadBytes,NULL)){wprintf(Ls,wszReadBuffer);memset(wszReadBuffer,0,MAXPATH);}}return0;}
  子进程:includeWindows。hincludecstdiointmain(){HANDLEhRead;HANDLEhWrite;hReadGetStdHandle(STDOUTPUTHANDLE);hWriteGetStdHandle(STDINPUTHANDLE);WCHARwszBuffer〔MAXPATH〕{0};只读一次DWORDdwReadBytes;if(ReadFile(hRead,wszBuffer,MAXPATH,dwReadBytes,NULL)){MessageBox(0,wszBuffer,L子进程读取到的数据:,MBOK);}else{MessageBox(0,0,L没有读取到数据,MBOK);}return0;}
  第四种方法:命名管道进程间通信
  服务端:includeWindows。hincludecstdiointmain(){HANDLEhPipeCreateNamedPipe(L。pipeaaaa,PIPEACCESSDUPLEX,PIPEREADMODEBYTEPIPEWAIT,PIPEUNLIMITEDINSTANCES,MAXPATH,MAXPATH,0,NULL);if(hPipeINVALIDHANDLEVALUE){printf(CreatePipeFailed);CloseHandle(hPipe);}WCHARszRecvBuffer〔1024〕;DWORDdwReadBytes;服务端在这里会进行堵塞,等待客户端进行连接if(ConnectNamedPipe(hPipe,NULL)){printf(ConnectNamedPipesuccess);memset(szRecvBuffer,0,1024);if(ReadFile(hPipe,szRecvBuffer,MAXPATH,dwReadBytes,NULL)){wprintf(LReadFileSuccesss,szRecvBuffer);}else{printf(ReadFileFailed,Erroriss,GetLastError());CloseHandle(hPipe);return1;}}CloseHandle(hPipe);return0;}
  客户端:includeWindows。hincludecstdiointmain(){HANDLEhPipe;WCHARwszBuffer〔MAXPATH〕Lhahahaha!!!;DWORDdwWriteBytes;if(WaitNamedPipe(L。pipeaaaa,NMPWAITWAITFOREVER)){printf(WaitNamedPipeSuccess);hPipeCreateFile(L。pipeaaaa,GENERICWRITEGENERICREAD,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL);if(hPipe!NULL){printf(ConnectPipeSuccess);if(WriteFile(hPipe,wszBuffer,MAXPATH,dwWriteBytes,NULL)){printf(WriteFiledataSuccess);}}}return0;}
  第五种方法:DLL共享节
  简单的说,其实就是声明DLL中的一段数据区为共享区,在学习DLL共享节的时候找到的如下一段话:
  在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的,因为所有的进程用的都收同一块地址空间;
  而在Win32环境中,情况却发生了变化,每个进程都有了它自己的4GB的内存空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。
  当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。(在物理内存中,多进程载入DLL时,DLL的代码段实际上是只加载了一次,只是将物理地址映射到了各个调用它的进程的虚拟地址空间中,而全局数据会在每个进程都分别加载)。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。
  因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。
  那么如何设置呢?方法:也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。
  设置的语法格式如下:pragmadataseg(DLLSharedSection)声明共享数据段,并命名该数据段intSharedData123;必须在定义的同时进行初始化!!!!pragmadataseg()
  一种方法是在。DEF文件中加入如下语句:SETCTIONSSharedREADWRITESHARED
  或者是直接声明:
  pragmacomment(linker,section:。DLLSharedSection,rws)
  或者是在编译器里面声明:在项目设置的链接选项(ProjectSetting〉Link)中加入如下语句:
  SECTION:Shared,rws
  dll编写代码:pragmaoncedefineMYAPIexternCdeclspec(dllexport)MYAPIintcdeclgetData();MYAPIvoidcdeclSetData(intyouData);includestdafx。hincludeTTTT。hpragmadataseg(MyShareSection)声明共享数据段,并命名该数据段intSharedData123;必须在定义的同时进行初始化!!!!pragmadataseg()pragmacomment(linker,section:。MyShareSection,rws)MYAPIintcdeclgetData(){returnSharedData;}MYAPIvoidcdeclSetData(intdwData){SharedDatadwData;}

盘点2022年各家手机厂商性价比最高的手机1iPhone14Pro搭载A16仿生处理器,采用台积电4nm工艺制程,拥有卓越的性能以及超低功耗,带来算力爆炸,与绝妙功耗平衡,日常创作游戏激战,全面出类拔萃正面是一块6。1英寸最新!中国科学院和东北大学连发3篇Science日前,中国科学院大连化学物理研究所中国科学院化学研究所和东北大学各添一篇Science。中国科学院大连化学物理研究所预对准非极性反应分子会导致较大的立体动力学效应,因为它们在通往反喜报!新远东电缆荣获江苏省智能制造示范车间近日,江苏省工业和信息化厅江苏省财政厅联合发布关于公布2022年江苏省智能制造示范车间名单的通知,远东智慧能源股份有限公司(简称远东股份股票代码600869)新远东电缆有限公司智能谷歌PixelWatch智能手表推送1月更新IT之家1月13日消息,谷歌PixelWatch手表在去年12月收到了第一次OTA更新,但仍有一些问题需要修复。谷歌现在发布了该手表的1月更新,并将逐步推出。此版本的主要错误Bug保罗本托谈马丁内斯执教葡萄牙争议重要的是能力不是国籍直播吧1月13日讯前韩国主帅保罗本托日前接受了RTP3采访,并谈到带领韩国在世界杯中迎战祖国葡萄牙,以及葡萄牙任命罗伯托马丁内斯一事。本托是葡萄牙人,此前在韩国国家队执教,并在世界智能马桶怎么选,蓄热储热泡沫盾等技能点如何取舍?本内容来源于什么值得买APP,观点仅代表作者本人作者心潮芃湃写在前面大家好,兄弟们好啊。转眼间又是新的一年了,本来以为元旦能够放假歇一下的,但是装友群的兄弟们又催更了农历新年也快要2022,汽车圈那些意想不到的骚操作,一个比一个离谱作者子成2022年是新能源车强势突围的一年,也是各种骚操作频出的一年。当然,这也是让部分消费者骂街的一年。01hr汽车界翻车事件频出2022,无疑是艰难的一年,同时又是深刻变化的一电动SUV春秋季续航能力排名这回看看能打几折冬季可以说是非常考验电动车续航的季节,在当下电动车发展非常迅速的时代,用户对于电动车的需求也是成倍增长。但到了春秋姐姐,电动车在没有寒冷冬天的室外温度下,续航里程究竟能否接近官方续泰国发现首例德尔塔克戎XAY。2世卫组织发布XBB。1。5风险评估泰国医学科学部近日发现了首例COVID19XAY。2变种病例。这一新变种是德尔塔菌株的一个亚变种AY。45和奥密克戎BA。45子变种的结合体,到目前为止,全球只发现了344例。因此厘析产业难题,智能计算中心2。0时代展望报告重磅发布!从电力经济到算力经济,全球产业正在经历一个大转折,这种转折在智能算力方面体现得尤为突出,无人驾驶的智能汽车,AIGC生产的炫目内容,如GPT3一样的AI大模型等等,都使得算力达到了变形金刚7无敌龙会登场吗,谈谈预告片的5个问题猩猩将军擎天圣,是否和恐龙金刚钢锁有关联what恐龙金刚的首领钢锁看真人电影的变形金刚,大家不要套用动漫超能勇士的世界观,因为电影只是引用一些角色开发全新的故事不会照搬。本期和小伙
交广会客厅货运增量,先锋有我芦存堂,58岁,宋家庄站货运计划员,核对专用线货源存量,做好货源调查组织工作,提报核实建议运量,是他的工作职责。工作繁杂,但数据需要精确,芦存堂任劳任怨,一干就是十几年,争当车站先上海经济恢复向好,9月工业总产值规模再创新高上海市三季度经济恢复向好,主要经济指标连续数月实现增长,经济增长新动能支撑有力,城市核心功能不断增强,经济运行总体呈现回稳向好的态势。根据地区生产总值统一核算结果,前三季度,上海市我国4大尴尬酒,因价格太便宜被小看,实际上是100纯粮酒我国4大尴尬酒,因价格太便宜被小看,实际上是100纯粮酒听说过因为包装太廉价被小看的白酒,也听说过因为知名度太低被小看的白酒,但小编最近发现,市面上居然还有因为价格太便宜被小看的白原油价格飙升导致成本陡增恒力石化营收维持平稳增长恒力石化(600346)10月28日晚间披露2022年三季度报告,今年前三季度,公司实现营业收入1703。57亿元,同比增长12。46,实现归属于上市公司股东的净利润60。87亿元缓解前列腺炎的这几种方法你一定要知道随着社会压力越来越大,很多男性朋友开始面临男性疾病的问题。前列腺炎作为一种非常常见的男性疾病,导致许多男性朋友患上前列腺炎,严重影响他们的日常生活。不管一个人有多强壮,他都容易生病谨慎不要从不安全的应用商店下载内容也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大少走了弯路,也就错过了风景,无论如何,感谢经历更多关于Android安全的知识,可前往ht双11那些值得购买的手机,个人主观推荐荣耀篇1荣耀X40搭载骁龙695处理器,采用6nm的制程工艺,功耗更低,性能上可以畅玩王者荣耀吃鸡等游戏,无压力正面是一块6。67英寸的AMOLED柔性曲面屏,支持120Hz的刷新率,支江西武功山山林枫叶红似火尽显秋日生态之美近日,江西萍乡武功山景区山林枫叶红似火,漫山茅草已变金黄。在暖阳的照射下,一幅秋日美景画卷翩然展开,尽显武功山生态之美。簇簇秋红点缀在山林之间,宛如调色盘。杨思旭摄时至深秋,大美武秋日田间地头忙当下正值三秋时节,各地村民抢抓农时,田间地头一派繁忙的景象。2022年10月25日,在湖南省永州市道县蚣坝镇光家岭村,村民在采摘金秋砂糖桔。CICPHOTO蒋克青摄2022年10月宁夏银川秋日湿地鸟蹁跹深秋时节,宁夏银川市永宁县境内的典农河湿地霞光秀丽,风景宜人。成群候鸟在迁徙途中在此停驻,或觅食嬉戏,或翩翩起舞,成为秋日里一道靓丽的风景线。2022年10月26日,宁夏银川市永宁十堰新建一座主题公园,就在这儿十堰广电讯(全媒体记者周贤林)日前,茅箭区清廉文化主题公园正式落成,成为市民休闲打卡的新地标。走进园区,一步一景,一景一廉,清廉景观与园区山水植被融为一体。茅箭区纪委监委依托百二河
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网