如何在动态库中接收发给主线程的线程消息?
(动态库中处理自己感兴趣的消息)
主程序中不处理部分消息, 这部分没有处理的消息在动态库中处理,不通过动态库上的方法调用,
windows 的消息机制有没有这样的机制能?
应该有吧, 因为MFC dll 中 有下面的消息映射:
BEGIN_MESSAGE_MAP(CModulerApp, CWinApp)
//{{AFX_MSG_MAP(CModSvrApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE(WM_DATA_ARRIVE, OnDataArrive)
END_MESSAGE_MAP()
但是我加了 ON_THREAD_MESSAGE(WM_DATA_ARRIVE, OnDataArrive) 后, OnDataArrive不会被调用。
而加到主程序中会被调用。
我这样做主要想实现 动态库的接口在同一个线程中,有这必要不? 如有如何实现呢?
不管有没有这个必要, 能实现吗?
感谢各位侠客!
------解决思路----------------------
动态库本质就是函数调用,至于属于哪个线程一般是谁调用就属于调用者的线程,除非动态库某个函数(功能)被调用后,动态库的函数内部创建了不同的线程;至于缺省的消息处理,完全可以如窗口过程传递参数给DefWindowProc那样,在动态库中定义的缺省处理的函数,在需要的场合调用该函数
------解决思路----------------------
拦截线程消息,irtual BOOL PreTranslateMessage(MSG* pMsg);
------解决思路----------------------
一个有高度和深度的问题!
------解决思路----------------------
DLL中提供一个接口,用来设置窗口过程的接口,SetWindowPos(..., GWL_WNDPROC, ...);
------解决思路----------------------
动态库自身没有进行消息循环,自然接收不到消息
除非你DLL中也创建消息循环,然后主线程可以PostThreadMessage来发送消息
对于DLL这种模块化设计,它的期望就是通过导出函数来进行调用,数据传递,而不是让你走消息机制
------解决思路----------------------
在dll中拦截主线程消息
------解决思路----------------------
没有完全弄懂楼主的整个意图。
其中一个不明点是:DLL的代码是在另外一个(被主线程启动的)子线程里执行吗?
一点题外话:
既然是发给主线程的消息,为什么一定要去拦截呢?
可以考虑主线程受到这个消息后,调用DLL里相应函数来处理。
如果是比较费时,可以启动一个worker thread,thread里再调用DLL的功能代码。
至于返回执行结果,可以是启动worker thread时提供参数,里面放main thread的window handle,
完成任务后给主线程发个消息。
以上
------解决思路----------------------
勾出来~~~~~~
------解决思路----------------------
让所有发送给主线程的消息都经过dll处理呗
------解决思路----------------------
可以试试 WH_GETMESSAGE, WH_CALLWNDPROC 钩子