想一想,在平时处理程序时候,我们都是在一个进程中进行处理,所以,在处理字符串时候,我们都不用考虑太多问题,处理什么样数据和数据发送
都会在同一个进程中进行。 但是,假如要你负责一个程序要在两个不同进程中交换数据,你会怎么办,你要想怎样做,一般做法是这样,自定义一个消息,然后你就把这个
数据放在这个消息附带参数WPARAM wParam 与 LPARAM lParam 中,不过这样只能限于非字符串传递,只能传递数字,或者你更聪明一点,把字符编
码,然后在另一个进程中解码,这样可以做成伪字符数据传递。 不过,这样方法都不错! 我在开始时候,使用了字符地址作为消息参数进行传递,可是由于进程间都是独立4GB内存空间,当接到我字符消息时候,就程序就误以为是自
已进程空间地址,所以就把读取了这个地址,一般结果来看,不是乱码就是空字符串。
那么我们有什么方法可以在消息中进行字符串传递呢?
我们可以使用两个Windows消息分别进行一个字符串两个进程间传递,
一个消息是WM_SETTEXT。
一个消息是WM_COPYDATA。
以下我来分析这两个消息怎么实现,
最简单是使用WM_SETTEXT消息了,这个方法只是使用一个字符串地址作为一个消息参数就可以实现了两个不同进程间消息互发了。
原因是因为这个消息会为这个字符串分配一个内存空间,在接收方就可以根据这个地址把这个字符串读取保存了
CString str = _T( "Hello" ); HWND hWndReceived = FindWindow( "Receiver", NULL ); SendMessage( hWndReceived, WM_SETTEXT, 0, (LPARAM) str ); 在接收方这样处理消息:
加入消息映射宏:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd) //{{AFX_MSG_MAP(CMyWnd) ... ON_MESSAGE( WM_SETTEXT, OnSetTextMsg ) ... //}}AFX_MSG_MAP END_MESSAGE_MAP() ... 加入消息映射函数:
afx_msg void OnSetTextMsg( WPARAM wParam, LPARAM lParam) OnSetTextMsg( WPARAM wParam, LPARAM lParam ) { char str[ 256 ]; wsprintf( str, "%s", (char*) lParam ); // 加入处理这个字符串语句 ..... }
使用WM_COPYDATA:CString str = _T( "Hello" ); HWND hWndReceived = FindWindow( "Receiver", NULL ); COPYDATASTRUCT cpd; cpd。dwData = 0; cpd。cbData = strDataToSend。GetLength(); cpd。lpData = (void*)str。GetBuffer(cpd。cbData); SendMessage( hWndReceived, WM_COPYDATA, 0, (LPARAM) & cpd ); str。ReleaseBuffer(); 加入映射宏: BEGIN_MESSAGE_MAP(CMyWnd, CWnd) //{{AFX_MSG_MAP(CMyWnd) ... ON_WM_COPYDATA() ... //}}AFX_MSG_MAP END_MESSAGE_MAP() ... 映射函数: BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData); return CMyWnd::OnCopyData(pWnd, pCopyDataStruct); }
这样就可以实现了不同进程间两个字符串之间互发!
本文来自: 我要开发网(http://www.51dev.com) 详细出处参考:http://51dev.com/plus/view.php?aid=7936