游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

进程通信的五种普通方法

  第一种:通过自定义消息来实现
  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;}

灰熊18分大胜步行者取9连胜莫兰特2310秀逆天战斧平筐隔扣北京时间1月15日,NBA常规赛,灰熊客场130112狂胜步行者18分,豪取9连胜,这也是联盟现存最长的连胜纪录。本场比赛,灰熊从上半场就牢牢把握领先优势,一度将分差拉开到19……冨谷至谈国际化东洋学研究者的养成中国政法大学法律古籍整理研究所教授赵晶冨谷至(章静绘)冨谷至先生是日本中国史领域的著名学者,精研法制史、简牍学等领域,成果丰硕,现为京都大学名誉教授、龙谷大学文学部……亲戚来借钱时,低情商的人直接说不借,高情商的人会如此拒绝文时光了了身处社会,谁都不是孑然一身,要在这个社会上站稳脚跟,光靠自己的力量是不行的。成功的必然条件之一就是团结多方力量作为辅助,互帮互助也是一种优良的美德,人人懂……北京免费赏冰瀑的景区,老少皆宜,还有冰上项目畅玩作者:萧汉冰雪相依,山水相连,冰瀑如林是北京冬日难得一见的自然山水奇观,冰瀑与四周峰林相对,恰似人间仙境,是很多人心神向往之地。在门头沟区岭角村有一个景区,春天可以……三位国军元老,建国后的地位堪比元帅,一人当选副主席作者:相忘于江湖55年授衔,有几位原国军的元老级人物,也有评元帅的资格。建国前夕起义投诚的蒋军将领,有几位被授予开国上将,如绥远的董其武、湖南的陈明仁、新疆的陶峙岳……王健林还没退休,王思聪先退出了虽退出了董事会,但王思聪仍是万达集团股东之一。文《中国企业家》记者李艳艳编辑周春林头图来源视觉中国没有微博的王思聪,依旧是顶流。久未发声的他,最近……强悍防守队风之灰熊今年让人眼前一亮的球队,非灰熊队莫属,球风稳健,防守强悍,队员年轻且有活力,在继承优良防守传统的基础之上,加强了进攻,可谓是攻防兼备的球队,重建计划大功告成!当家球星莫兰……退役三十年重新驾机,八十二岁苗晓红的传奇,究竟告诉我们什么?谁说女子不如男,在历史的长河之中有无数的女性留下了浓重的一笔。她们敢于突破所有固执的偏见,闯出对自己生命的禁锢。成功并不容易,而女性能够取得成功可能会更加困难。但每个年代和时期……国奥0北京时间3月24日,中国国奥队迎来了迪拜杯首场比赛,球队经过90分钟激战,01不敌阿联酋国奥队,吞下了一场败仗,这对于中国国奥队来说确实是一个非常巨大的打击。众所周知,这支国奥……西学本文来源:文明的意志感谢阮炜教授赐稿!导读:与历史上的所有帝国相比,俄罗斯人为什么能够如此迅速地扩张,竟在两百来年里便建立了版图堪比蒙古帝国的大帝国?俄罗斯帝国为什……晚年的蒋介石懊悔不已,感慨最大的失策,没把精锐部队撤出东北1949年人民解放军百万雄师渡过长江,南京国民政府彻底垮台。蒋介石先后辗转到了西南多地,后来又狼狈逃到了台湾,并在那里度过了余生。到台湾之后蒋介石也花了好些时间,总结其在……借口与美化帝王的合法性问题古代皇帝称为天子。奉天承运皇帝诏曰这一说法是明朝才开始出现的。而诏可以追溯到秦始皇,统一六国后,自称朕,命为制,令为诏,他的玉玺上刻有受命于天,既寿永昌字样。古代帝王都宣……
佛入灭一个月后,迦叶和阿难爆发矛盾,造成佛教100年后大分裂佛教历史上有过多次著名的大集结,各个教派对于其次数有着不同的看法,有的说是六次大集结,也有的说是五次大集结,还有的说是四次大集结等等。在集结的内容上,佛教内部也存在相当大的争议……背影姑娘颜红英渡江战役时摇船送我军过长江,追寻50年终找到打过长江去,解放全中国!70多年前的春天,20余万中国人民解放军从靖江飞渡长江,吹响了渡江战役的号角。渡江战役期间拍到过很多珍贵的历史照片,其中一张照片在1949年发表在……霍去病带十几车肉出征,等肉臭掉也不给士兵吃,事后才知他真聪明霍去病,是一个奇迹一般的存在,可以说他短暂的一生如同花火一般,照亮了两千多年来历史的夜空。18岁从军的霍去病,在短短的6年时间内创下了无数的奇迹,河西之战、漠北之战、封冠……地球气候变化及其主要原因杨新兴中国环境科学研究院气候中心,中国北京100012摘要:162字(1)地球气候变化的主要因素是自然因素,而不是人为因素。(2)人为活动排放的温室气体不是导……美国摄影家镜头下民国初期四川人们的生活百态西徳尼戴维甘博(1890年1968年)是美国社会经济学家,人道主义者和摄影家。他是宝洁公司创始人之一詹姆斯甘博的孙子。甘博先生毕业于美国普林斯顿大学,第一次到中国是十八岁。刚刚……秦始皇曾修了一条路,连通3省,为何2000年过去,从不长草?《始皇寻鼎》有言:昔日有嬴政,六国一扫平。这句诗所写的自然就一统六国,自称为皇帝的秦始皇嬴政。提到秦始皇,大家自然是对他又爱又恨,秦始皇有很多傲人的功绩,统一六国就是其中……泰山队最新动态未来两场比赛突生变故,球迷呼吁对深圳队下死手山东泰山队在战胜广州队后,目前在少赛一轮的情况下,仍然落后领头羊武汉三镇队3分,依然保持着争冠的希望。按照足协的安排,泰山队将会在晋江赛区先后与广州和淄博蹴鞠完成中超和足协杯的……1950年,警卫员向乞丐老妇问路,却发现她是开国将军的老母亲1950年,时任西康省军区司令员的刘忠将军已经整整十八年没有回过家乡了,由于战争的原因,刘忠将军上一次匆匆路过家乡还是1932年的时候。新中国成立后,对家乡和母亲放心不下的刘忠……我国首任公安局长谭正文,史称接管北平第一人,可佩枪出入中南海1948年12月14日,在西柏坡准备接管大中城市干部培训的谭政文突然接到主席指派,让他马上带领已经挑选好的108名干部(被戏称为108位好汉)前往北平监管国民党北平市的警察局,……十大元帅中谁酒量最好?林彪连斯大林敬酒都不喝,陈毅常找人斗酒古往今来,许多英雄人物都好美酒,尤其对那些将领来说,酒更像是一种魔咒,你避不了,也戒不掉。历史上许多军队在打了大胜仗以后,庆祝的方式就是让士兵们痛饮一番,以此犒劳战斗的辛苦。其……将军大获全胜,百姓门前挂牌欢迎,将军悄悄对身后人道屠城朱元璋当了皇帝后几乎杀尽了有功之臣,但有一人却幸免于难,此人就是杀神常遇春。当然,常遇春是在朱元璋登基的第二年死的,也有可能是没等到被杀的时候,不过他除了杀的人太多以外还……我军副师长叛逃台湾,蒋送黄金和娇妻,为何不到一年将其枪毙?1957年12月17日,驻防在金门岛的国民党士兵在蒙蒙晨雾之中看到一叶小渔船驶入海湾。难道是对面的解放军准备进攻,派遣渔船前来侦察军情?国民党士兵不敢怠慢,等渔船一靠岸,立即将……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网