利用自定义消息处理函数的WPARAM或LPARAM参数传递指针

有自定义消息:
#define WM_TESTWM_USER+121
消息处理函数:
afx_msg void OnTest(WPARAMwParam,LPARAMlParam);
该消息是一个主线程向辅助线程发送数据的消息。
主线程中发送消息的代码:
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传递,因为当消息响应时改变量可能已经不在了。

你可能感兴趣的:(param)