想一想,在平時的處理常式的時候,我們都是在一個進程中進行處理,所以,在處理字串的時候,我們都不用考慮太多的問題,處理什麼樣的資料和資料的發送都會在同一個進程中進行。
但是,假如要你負責一個程式要在兩個不同的進程中交換資料,你會怎麼辦,你要想怎樣做,一般的做法是這樣,自訂一個訊息,然後你就把這個資料放在這個訊息附帶的參數WPARAM wParam 與 LPARAM lParam 中,不過這樣只能限於非字串的傳遞,只能傳遞數字,或者你更聰明一點,把字元編碼,然後在另一個進程中解碼,這樣可以做成偽字元的資料傳遞。
不過,這樣的方法都不錯!
我在開始的時候,使用了字元地址作為訊息參數進行傳遞,可是由於進程間都是獨立的4GB記憶體空間,當接到我的字元訊息的時候,就程式就誤以為是自已的進程空間的地址,所以就把讀取了這個地址,一般結果來看,不是亂碼就是Null 字元串。
那麼我們有什麼方法可以在訊息中進行字串的傳遞呢?
我們可以使用兩個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
END_MESSAGE_MAP()
...
映射函數:
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}
這樣就可以實現了不同進程間兩個字串之間的互發!