如何在动态库中接收发给主线程的线程消息?

greenabc 2015-10-17 03:47:29
如何在动态库中接收发给主线程的线程消息?
(动态库中处理自己感兴趣的消息)

主程序中不处理部分消息, 这部分没有处理的消息在动态库中处理,不通过动态库上的方法调用,
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不会被调用。
而加到主程序中会被调用。

我这样做主要想实现 动态库的接口在同一个线程中,有这必要不? 如有如何实现呢?
不管有没有这个必要, 能实现吗?
感谢各位侠客!
...全文
497 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2016-09-06
  • 打赏
  • 举报
回复
楼主,你是怎么解决这个问题的呢?
greenabc 2015-11-07
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
动态库本质就是函数调用,至于属于哪个线程一般是谁调用就属于调用者的线程,除非动态库某个函数(功能)被调用后,动态库的函数内部创建了不同的线程;至于缺省的消息处理,完全可以如窗口过程传递参数给DefWindowProc那样,在动态库中定义的缺省处理的函数,在需要的场合调用该函数
抱歉,给你分少了, 论坛速度太慢了,结完贴后回来看才发现。
zgl7903 2015-10-28
  • 打赏
  • 举报
回复
可以试试 WH_GETMESSAGE, WH_CALLWNDPROC 钩子
老王爱上猫 2015-10-28
  • 打赏
  • 举报
回复
让所有发送给主线程的消息都经过dll处理呗
kangkun 2015-10-28
  • 打赏
  • 举报
回复
勾出来~~~~~~
greenabc 2015-10-27
  • 打赏
  • 举报
回复
Dll 中的消息映射能够使用的话,应该是比较完美的。
greenabc 2015-10-27
  • 打赏
  • 举报
回复
引用 13 楼 stanlynet 的回复:
在dll中拦截主线程消息
如何拦截,不用 hook 可以吗
gznotes.net 2015-10-24
  • 打赏
  • 举报
回复
没有完全弄懂楼主的整个意图。 其中一个不明点是:DLL的代码是在另外一个(被主线程启动的)子线程里执行吗? 一点题外话: 既然是发给主线程的消息,为什么一定要去拦截呢? 可以考虑主线程受到这个消息后,调用DLL里相应函数来处理。 如果是比较费时,可以启动一个worker thread,thread里再调用DLL的功能代码。 至于返回执行结果,可以是启动worker thread时提供参数,里面放main thread的window handle, 完成任务后给主线程发个消息。 以上
stanlynet 2015-10-24
  • 打赏
  • 举报
回复
在dll中拦截主线程消息
greenabc 2015-10-23
  • 打赏
  • 举报
回复
有正在研究工作线程和主线程同步数据的没? 并且工作线程在 dll 里。 自己再顶......
greenabc 2015-10-21
  • 打赏
  • 举报
回复
谢谢帮顶...


再顶......


oyljerry 2015-10-20
  • 打赏
  • 举报
回复
动态库自身没有进行消息循环,自然接收不到消息 除非你DLL中也创建消息循环,然后主线程可以PostThreadMessage来发送消息 对于DLL这种模块化设计,它的期望就是通过导出函数来进行调用,数据传递,而不是让你走消息机制
greenabc 2015-10-20
  • 打赏
  • 举报
回复
继续顶起来 ...
greenabc 2015-10-20
  • 打赏
  • 举报
回复
WM_DATA_ARRIVE 是动态库内子线程发给主线程的消息, 该动态库我只在主线程(UI线程)调用, 该动态库是纯功能模块,没有UI,没有UI也是能有消息循环的。
Eleven 2015-10-19
  • 打赏
  • 举报
回复
DLL中提供一个接口,用来设置窗口过程的接口,SetWindowPos(..., GWL_WNDPROC, ...);
definegg 2015-10-19
  • 打赏
  • 举报
回复
一个有高度和深度的问题!
worldy 2015-10-18
  • 打赏
  • 举报
回复
动态库本质就是函数调用,至于属于哪个线程一般是谁调用就属于调用者的线程,除非动态库某个函数(功能)被调用后,动态库的函数内部创建了不同的线程;至于缺省的消息处理,完全可以如窗口过程传递参数给DefWindowProc那样,在动态库中定义的缺省处理的函数,在需要的场合调用该函数
笨笨仔 2015-10-18
  • 打赏
  • 举报
回复
拦截线程消息,irtual BOOL PreTranslateMessage(MSG* pMsg);
greenabc 2015-10-17
  • 打赏
  • 举报
回复
顶起来! .............

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧