From: http://blog.csdn.net/handsomewang527/article/details/1676259
随着我们开发的应用的日益复杂,像以往那样将所有功能坐在一个exe文件中情况越来越少,更多时候是整个应用由若干模块、甚至若干单独的exe文件组成,这就涉及到了模块或进程间的通讯交互问题,本文主要谈谈在进程间的信息传递方法,作为进一步探讨进程间通讯方案的参考。
1.使用用户自定义消息在进程间传递消息。
经过一定时间的Win32开发,大家对Windows Mobile平台下的消息映射机制应该都比较清楚了,除了系统已经为我们设定的如WM_CREATE、WM_PAINT这类消息外,还有一种特殊的WM_USER消息用于用户自定义消息。
定义格式如下:
#define WM_IAMHANDSOME WM_USER+1
然后同样的对于WM_IAMHANDSOME同样的将它映射到相应的处理函数上去。
当需要使用激发该消息时,采用SendMessage函数发送一个WM_IAMHANDSOME即可。下面谈谈在进程间如何进行用户自定义消息的传递。
例,假设两个程序,一个叫zoujielun,一个叫feiyuqing,两个程序进行一项操作,唱一首名叫《千里之外》的歌。
其中即需要一个程序“唱”完后通知另一个程序接着“唱”。
1)在两个程序中都定义#define WM_YOUTURN WM_USER+10
2)在feiyuqing进程中加入对应WM_YOUTURN的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_YOUTURN,OnYouturn},
//……
};
3)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:
Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing”), _T(“feiyuqing"));
SendMessage(findWindows,WM_YOUTURN,0,0);
这样,即把消息发送给了feiyuqing进程。
4)在feiyuqing中,对应的OnYouTurn做出相应处理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
Sing(_T(“我送你离开千里之外 ……”));
return 0;
}
这样即实现了进程间通过自定义消息传递来进行通讯,但是这样的缺点是不能同时传递数据。假设feiyuqing因为年纪大了,如果突然“失忆”了,不记得歌词,需要zoujielun不但告诉他该唱了,还要告诉他该唱什么,这时就需要利用系统一个强大的消息WM_COPYDATA。
2.使用WM_COPYDATA消息跨进程传递数据
在SDK中,该消息对应的参数为:
WM_COPYDATA wParam = (WPARAM)(HWND) hwnd;
lParam = (LPARAM)(PCOPYDATASTRUCT) pcds;
关键在于第二个参数,即一个COPYDATASTRUCT结构的指针。
该数据结构的结构如下:
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
第一个数据成员可以传递一个DWORD类型,如果只是要在进程间传一个DWORD类型的数据,这里可以直接用这个成员传递。
关键在第二、三个数据成员,第三个lpData即为欲传递的数据的指针,第二个cbData即为传递的数据大小,以byte为单位。
下面举例,还是zoujielun和feiyuqing程序间的通讯。
1)在feiyuqing进程中加入对应WM_COPYDATA的映射:
const MSG_MAP_MAIN_S g_mainMsg[] =
{
//……
{WM_COPYDATA,OnYouturn},
//……
};
2)在zoujielun中向feiyuqing发送WM_YOUTURN的消息,代码如下:
Sing(_T(“屋檐如悬崖风铃如沧海我等燕归来……”));
HWND findWindows=NULL;
findWindows= FindWindow(_T(“feiyuqing"), _T(“feiyuqing"));
TCHAR *sContent = new TCHAR[256];
wsprintf(sContent,_T(“我送你离开千里之外……"));
COPYDATASTRUCT copyData;
copyData.cbData = _msize(sContent);
copyData.lpData = sContent;
SendMessage(findWindows,WM_COPYDATA,0,(LPARAM)©Data); // 不能使用PostMessage,因为这是个非阻塞的函数,对方会收不到发来的消息的。
3)在feiyuqing中,对应的OnOnYouTurn做出相应处理即可。
LRESULT OnYouTurn(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR *sContent = NULL;
sContent =(TCHAR*)((COPYDATASTRUCT*)lParam)->lpData;
Sing(sContent);
return 0;
}
即收到该消息后从相应参数取出数据进行处理。
学累了吧,快来看看我的非技术博客:猫思猫想