EVC4写的COM Dll 中如何接收其他应用程序发过来的消息

wmlhjn   2008-6-2 16:11 楼主
EVC4写的COM Dll,这个COM DLL是作为一个插件被一个WIN32程序调用,com dll实现了规定的接口函数,现在需要这个COM DLL能接收另外第三方程序发过来的消息通知,然后自己做一些事情,想使用SendMessage或PostMessage发过来的,但hWnd不能确定,后来在COM Dll内创建了一个窗口,接收消息,但是实际运行后发现窗口短暂出现后就消失了,第三方程序发送WM_USER到这个新建的窗口,通过日志观察,倒是记录过一些消息过来了,但没有收到任何WM_USER消息,我就很不解了?

我CreateWindow时,hWndParent设为NULL,hInstance设为NULL,因为这两个我得不到,难道是这个原因?

请高手给一些思路了,谢谢了。

回复评论 (2)

不明白你为什么这么用COM,COM应当在系统中注册,然后其它程序用标准方法调用COM的接口。
另外你窗口消失可能是被其他窗口挡住了,或者是COM调用被Release了,导致窗口被Destory。

WM_USER没收到可能是窗口没找到或消息队列被阻塞了,这在单线程程序中很常见。

其实我建议你没必要创建一个窗口去接收消息,因为另一个程序还要去FindWindow,直接创建一个消息队列

然后PostThreadMessage也行。最好的办法还是维护一个线程,用event来通信。


点赞  2008-6-2 16:39
说明一下:
其实我要写的是一个SmartPhone上的主题插件程序,按照微软的SDK和MSND上的规定,主题插件是实现IHomePlugin,IPersistStream接口的COM Dll,由Home.exe调用,由于我的插件需要接收另外第三方exe程序发过来的消息通知,我在Google论坛看到有人遇到同样的问题,回复者说可以用dll内创建一个隐藏的窗口来接收消息,所以我才写了测试程序,在消息回调函数WinProc(...)加入日志观察,发现启用本插件后日志就能进入函数几次(仅几次后再收不到消息了),但没有一次进入WM_USER。有可能是你说的消息被阻塞了,是不是宿主程序Home.exe拦截了?

To nbcool:
如果不用隐藏窗口去接收消息,而是在这个主题插件Initialize(...)时新开一个线程接收消息,第三方的Exe程序PostThreadMessage过来能收到吗?
点赞  2008-6-3 10:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复