很早以前写的,介绍用MFC的时候处理窗口消息的流程
<一> 在同一进程内通过消息通信
一.在你的相关头文件中加入自定义消息常量比如一个串口读完成的消息:
#define WM_COMM_READCOMPLETE WM_USER+1001
二.再在你的主线程要负责处理该消息的那个窗口中(比如CFormView1)加入这个消息的映射:
BEGIN_MESSAGE_MAP(CFormView1, CFormView)
ON_MESSAGE(WM_COMM_READCOMPLETE,OnReadComplete)
END_MESSAGE_MAP()
三.之后在窗口类CFormView1中定义OnReadComplete这个消息处理函数:
class CPortFormView : public CFormView
{
public:
afx_msg LONG OnReadComplete(UINT ,LONG buf);
……
}
然后你在CFormView1的实现文件中实现OnReadComplete这个函数,完成该消息的处理.
四.这样你在在其它辅助线程里要向CFormView1窗口发消息WM_COMM_READCOMPLETE并让
主线程去执行消息处理函数OnReadComplete时,你只需要用下面两个函数之一就行
::PostMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);
::SendMessage(hWndFormView1,WM_COMM_READCOMPLETE,wParam,lParam);
其中hWndFormView1为窗口句柄;wParam,lParam你可以用来传参数
五.注意使用多线程的方法要正确,避免死锁
<二>在不同的进程间消息通信 ,并传递字符串这样的数据
定义一个用户消息,在DLL中:
UINT uret=RegisterWindowMessage(“GET_ZWZ_EXE_BOOL”);
BSTR bstrret;
SendMessage(wnd_of_exe,uret,0,(LPARAM)&bstrret);
bool bdata;
if(SysStringLen(bstrret)==4)
bdata=true;
else
bdata=false;
SysFreeString(bstrret);
在EXE中:
also UINT uret=RegisterWindowMessage(“GET_ZWZ_EXE_BOOL”);
处理消息:
BSTR* pbdata=(BSTR*)lParam;
if(bTrue)
{
*pbdata=_bstr_t(“True”).copy();
}
else
{
*pbdata=_bstr_t(“False”).copy();
}
Leave a Reply