MFC ActiveX OCX 中的消息问题

weichaogui 2011-07-11 04:11:55
本人用MFC ActiveX写了一个OCX,内部使用了多线程,如果在多线程中直接触发事件,那么会引起VB、C#、Delphi调用异常,因而改为在多线程中用SendMessage来触发事件。现在把OCX的属性改为INVISIBLEATRUNTIME后,OCX的m_hWnd总是为NULL,因此无法接收线程中Send的Message,为解决此问题,我在OCX的构造函数里RecreateControlWindow(),此时OCX的m_hWnd便不再为NULL,故能正常的接收Message然后触发事件。于是VB、C#、Delphi能正常接收事件了。可是在Delphi的调用中又出现了另一个问题,那就是把OCX拖到窗体,运行界面,啥也不干,然后关闭窗体,Delphi就出错了(是在Delphi的IDE界面下运行出错,如果直接运行exe便正常),通过调试定位,知道原因在于RecreateControlWindow()后,Delphi退出释放有问题。此问题困绕我好几天,无法解决,望各位高人指点迷津。
...全文
402 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weichaogui 2011-07-23
  • 打赏
  • 举报
回复
本以为把接口写成ActiveX形式方便别人使用,没想会出现这种问题。

最后还是把接口改为标准Win32的DLL,由调用方自定义消息,并向DLL传入消息句柄,DLL内部获得此句柄来SendMessage或PostMessage。

本人用VC写接口给VB、C#、Delphi调用时的一点经验:如果调用方不是VC程序,切勿在多线程中使用外部回调函数,切勿在多线程中直接Fire事件。
maquan 2011-07-18
  • 打赏
  • 举报
回复
既然你需要那个 m_hWnd,那就不要用 INVISIBLEATRUNTIME 了。

用别的办法实现“不可见”吧,比如 Visible,或者把尺寸设置成 1x1。


————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
weichaogui 2011-07-18
  • 打赏
  • 举报
回复
触发宿主窗体的事件不是没想过,但这给用户带来使用上的不便,以VC为例,用户要定义消息及消息函数,还要把消息与消息函数加到MessageMap中,其他语言在自定义消息时是否也需要好几个步骤?如果我在控件内触发自已的消息,用户只需双击控件添加事件处理函数即可。
我现在想要的就是控件在运行时不可见,但又能处理消息。
以Delphi为例,如果我在设计初期或初始化宿主窗体时指定控件的Visible属性为False,那么该控件在运行时没有窗口句柄,不能触发消息。如果把控件在窗体上先显示后隐藏,那么控件就存在窗口句柄,可以处理消息。
康斯坦汀 2011-07-15
  • 打赏
  • 举报
回复
感觉你的思路有问题,没有那么麻烦吧? 可以直接给宿主窗体发消息。任何OCX
都是放在Window上的,这个Window不管是Delphi,vb还是C#写的都有窗体吧?
获得宿主窗体句柄,给他发消息。触发它的事件即可,多线程也一样。不会造成异常,
除非你的程序有bug。
weichaogui 2011-07-15
  • 打赏
  • 举报
回复
我改用ATL来改写此控件,如果是INVISIBLEATRUNTIME,当非VC语言调用时其m_hWnd还是为空,即便是设了WindowOnly仍然如此。
weichaogui 2011-07-13
  • 打赏
  • 举报
回复
唉,自己顶。
yuqangy 2011-07-13
  • 打赏
  • 举报
回复
我负责接分 …………
^^
weichaogui 2011-07-12
  • 打赏
  • 举报
回复
没人知道吗?

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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