当前位置: 代码迷 >> VC/MFC >> 怎么在动态库中接收发给主线程的线程消息
  详细解决方案

怎么在动态库中接收发给主线程的线程消息

热度:97   发布时间:2016-05-02 03:26:10.0
如何在动态库中接收发给主线程的线程消息?
本帖最后由 greenabc 于 2015-10-17 15:50:11 编辑
如何在动态库中接收发给主线程的线程消息?
(动态库中处理自己感兴趣的消息)

主程序中不处理部分消息, 这部分没有处理的消息在动态库中处理,不通过动态库上的方法调用,
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 钩子
  相关解决方案