1. 程式人生 > >利用自定義訊息處理函式的WPARAM或LPARAM引數傳遞指標

利用自定義訊息處理函式的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!!!