我需要让第二个线程进行一些错误检查,这工作正常。主线程是一个无窗口的 ActiveX OCX。
不过,我想做的是让第二个线程将消息发回主线程。我已经设置了一个消息映射和一个消息处理程序。从第二个线程内部,我使用 PostMessage 来放置消息。我知道我到了那里,并且我知道消息会被发布,因为 PostMessage 调用的返回值是一个 (TRUE)。我从来没有看到消息处理程序的任何响应。它似乎没有被调用。
我的 Visual Studio 2012 ActiveX 项目中的代码片段:
//Message handler definition from the .h file:
protected:
afx_msg LRESULT OnHSAmessage(WPARAM wParam, LPARAM lParam);
//From the .cpp file:
BEGIN_MESSAGE_MAP(CHSAObserver_ActiveXControlCtrl, COleControl)
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
ON_MESSAGE(WM_HSAMESSAGE, &CHSAObserver_ActiveXControlCtrl::OnHSAmessage)
END_MESSAGE_MAP()
// thread creation (this works)
HSAWnd *pWnd = new HSAWnd(this);
hwndTarget = pWnd->Create();
HANDLE threadHandle = CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID) hwndTarget, NULL, &dwID);
//thread implementation
LONG ThreadProc(LPVOID pParam)
{
BOOL status;
//I know I get here the Postmessage call does not result
//in the message handler being invoked
MessageBox(_T("inside threadproc"));
CHSAObserver_ActiveXControlCtrl *pCtrl = (CHSAObserver_ActiveXControlCtrl*)pParam;
//post message using global HSAWnd
status = PostMessage(hwndTarget, WM_HSAMESSAGE,(WPARAM)NULL,(LPARAM)NULL);
//post message using Class window (here for testing only)
//status = PostMessage (pCtrl->m_hWnd, WM_HSAMESSAGE,(WPARAM)NULL,(LPARAM)NULL);
return TRUE;
}
afx_msg LRESULT CHSAObserver_ActiveXControlCtrl::OnHSAmessage(WPARAM wParam, LPARAM lParam)
{
//this never happens
MessageBox(_T("message posted"));
return 0;
}