引用: 引用 9 楼 manch1986 的回复:
给个具体的API行吗?
说说我的解决方法:进程间通信
1.发消息-利用windows系统的消息队列发送(基于窗口GUI机制)
使用API:
SendMessage/PostMessage:发送消息,参数需要窗口句柄;
FindWindow:查找窗口句柄,需要知道窗口名(title)
例:
进程P1,进程P2,需要通信,假设进程P1中有窗口名为“Window_P1”
那么通信时进程P2只需向进程P1中的“Window_P1”发送消息即可,(自定义系统,系统消息均可),如果数据量大可发送COPYDATA消息;进程P1只需要在窗口回调函数中处理相关消息即可;
如何发送消息,就用“SendMessage/PostMessage”,但是这两个API需要窗口句柄作为参数,我们只需要找到“Window_P1”的句柄就可以了。利用“FindWindow”函数,传入“Window_P1”便可获得“Window_P1”的句柄。
(如果你想问,进程P2怎么知道进程P1的窗口名,呵呵原因很简单,因为两个进程都是自己开发的自己写的代码,所以知道)
如果P1向P2发送消息,原理相同(需要有接受窗口);
2.点对点消息队列
这个方法说简单也不简单,上面说的有些不严谨,见谅
使用API:
CreateMsgQueue-创建点对点消息队列
WriteMsgQueue-向消息队列中写入消息
ReadMsgQueue-从消息队列中读取消息
OpenMsgQueue-打开已创建的消息队列
CloseMsgQueue-关闭消息队列
例:
进程P1,进程P2,需要通信
进程1创建消息队列"CreateMsgQueue",创建时需要制定队列的名字,和队列的属性,一般来说创建的时候只能指定队列为只读或只写属性;(如果两进程要相互读写消息,可能需要两个队列)函数原型:
- HANDLE CreateMsgQueue(
- LPCWSTR lpszName, //队列名
- LPMSGQUEUEOPTIONS lpOptions //队列属性
- );
参数具体含义不多说了,去MSDN中找;
进程P2也创建消息队列,名字同P1的相同,这样可获得相同的消息队列句柄;
然后利用ReadMsgQueue/WriteMsgQueue读写即可。(这里可能有问题,原来我们也遇到过,就是有时读写不成功,按照MSDN上的介绍需要使用OpenMsgQueue,但是OpenMsgQueue中需要进程句柄,在Win32下可以通过枚举系统进程然后在比较进程名来获得,但是CE下貌似不支持EnumProcesses函数,比较麻烦~)
如果你用.Net开发的话给你个网页看看:
http://msdn.microsoft.com/en-us/library/aa446556.aspx
里面对点对点的消息队列进行了封装,而且提供例程下载(用VS2003打开,其实他的实现也是直接创建然后读写的)。
注:下载的地方在Figure 1 的上面,慢慢找,不过推荐你看看此文,写得不错~
说了这么多,还是没有给个例程,见谅~