淺議VC程式中進程間資訊交換方法

來源:互聯網
上載者:User

想一想,在平時的處理常式的時候,我們都是在一個進程中進行處理,所以,在處理字串的時候,我們都不用考慮太多的問題,處理什麼樣的資料和資料的發送都會在同一個進程中進行。

  但是,假如要你負責一個程式要在兩個不同的進程中交換資料,你會怎麼辦,你要想怎樣做,一般的做法是這樣,自訂一個訊息,然後你就把這個資料放在這個訊息附帶的參數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);
}

  這樣就可以實現了不同進程間兩個字串之間的互發!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.