利用自定義訊息處理函式的WPARAM或LPARAM引數傳遞指標
相關網帖
程序間的訊息傳遞(CString值傳遞
有自定義訊息:
#define WM_TEST WM_USER+121
訊息處理函式:
afx_msg void OnTest(WPARAM wParam,LPARAM lParam); 該訊息是一個主執行緒向輔助執行緒傳送資料的訊息。
主執行緒中傳送訊息的程式碼:
m_param.pDoc=pDoc;
m_param.pSpecAnlyz=m_pSpecAnlyz;
// CWinThread* pThread=AfxBeginThread(ThreadTest,static_cast<LPVOID>(&m_param));
m_pTestThread=(CTestThread*)AfxBeginThread(RUNTIME_CLASS(CTestThread));
Sleep(200);
// 必須先把&m_param轉化為void*指標,然後才可以進一步強制轉化為WPARAM
m_pTestThread->PostThreadMessageW(WM_TEST,(WPARAM)((void*)&m_param),1);// 傳送測試訊息 m_param為自定義型別,其成員為指標變數,因此 m_param無法強制轉化為WPARAM。但是m_param的地址指標和WPARAM一樣,都是4個位元組,因此可以將m_param的地址指標起那個只轉換為WPARAM。在VC.NET2005中,直接轉換編譯報錯。考慮到void * 之後,先將&m_param轉化為void*指標,然後才可以進一步強制轉化為WPARAM。
同樣的,在OnTest中,必須先將wParam強制轉換為void * ,然後進一步轉換為其他型別。
PS:網上有高手指出,區域性指標變數最好不要作為wParam或 lParam傳遞,因為當訊息響應時改變數可能已經不在了。
//==================================================================================================================
備註:
1》其實也就是傳個32位指標值而已,其它的具體資料值就是通過這個指標去訪問去做文章了,不過要求傳全域性的指標,在堆/棧上的指標很可以被系統
收回而成為非法指標!
如下形式...
unsigned char g_Buf[1024];
SendMessage(hWnd, xxx_Msg, xxx_wParam,(LPARAM) g_Buf);
2》其實傳指標只能限於同一個程序內傳遞的,不同程序間傳遞很容易造成對指標所指向的內容的非法訪問
3》不同程序間傳指標最好使用WM_COPYDATA 訊息來傳,它內建有共享記憶體機制;但是WM_COPYDATA 訊息必須使用SendMessage來發,不能使用PostMessage!!!