• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > ActiveX控件中创建线程碰到的奇怪问题

ActiveX控件中创建线程碰到的奇怪问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了activex控件下载,activex控件,activex控件被阻止,activex控件官方下载,activex控件下载安装等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: ActiveX控件中创建线程碰到的奇怪问题
描述:

组件中创建了线程,在线程函数中调用FireEvent客户程序中收到事件通知时会引起崩溃,请那位大侠支着,谢谢


解决方案1:

有:
这是lop5712(LOP)的回答,我转贴给你。
  
那是因为FireEvent实际上是调用客户端实现的一个接口(在这就是IE实现的IDispatch接口)的方法,而ActiveX控件一定是放在STA套间(虽然也可以,但应该没人实现为放在MTA)的,因此工作线程调用IE的IDispatch接口一定且必须是代理接口,这个接口必须通过汇集得到(以创建代理对象)。
即需要在主线程调用CoMarshalInterface来列集IE的那个IDispatch接口,再在工作线程调用CoUnmarshalInterface来散集IDispatch接口,进而在工作线程中通过散集的IDispatch接口发起事件。由于楼主是在线程间汇集接口,所以可以使用CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream代替上面的两个函数进行汇集,效率会有所提高。
而这样做(即建立代理对象)的实际工作工程,与楼主说的“另外”是异曲同工的,所以楼主要是闲上面麻烦,可以按照楼主说的“另外”来实现。
还有就是COleControl是MFC的包装类,其中使用了一些MFC的底层的机制(如线程状态等),所以当欲跨线程传递ActiveX对象的指针时,不可直接传递COleControl*之类,否则就有可能发生断言失败,而应该通过FromHandle和Detach来传递句柄(不过这样就不能使用派生类的相关成员函数)。因此楼主如果想使用上面的方法,需先获得客户的接口指针(即IDispatch),然后将其列集得到的IStream*作为线程参数传递给工作线程,而不要使用直接的this。
详见:
http://expert.csdn.net/Expert/topic/2650/2650433.xml?temp=.8801386
  
 

解决方案2:

很简单,在控件内部公开一个方法,客户端用这个方法把自己的窗口句柄或者主线程ID告诉控件,然后控件就可以截获消息了

解决方案3:

不要在内部创建的线程调用FireEvent,postmessage到ActiveX控件窗口,由那里调用FireEvent

解决方案4:

抱歉,没有看前面的代码,但你上面的线程函数不知是不是你省略掉了,在执行几乎全部的COM函数前需要调用CoInitialize( NULL );以进入STA套间(也可使用CoInitializeEx进入MTA,视你的需要)。在退出线程前调用CoUninitialize();
    请确保调用了CoInitialize和CoUninitialize

解决方案5:

这是VB的限制,他只允许一个主线程运行,如果有其它的线程运行,它会强制终止线程,如果终止失败,VB就会“当掉”。
    你必须在主线程中激发事件,你在工作线程中投递一个消息到主线程中,然后再激发事件,但你最好不要用窗口类的指针,应该用窗口句柄发送,就像这样::PostMessag(hWndDlg,...);


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 讨论一下activex方面的经典书目!
  • 有没有dataedit控件啊急啊
  • 为什么VC做的控件在VB下面会有问题啊?请高手指点,高分求教啊
  • 紧急求助:关于ActiveX控件的使用问题!!
  • ActiveX控件的属性页
  • 在ActiveX控件中使用多线程后Fire事件的问题
  • 可以在ActiveX控件下的Dialog画曲线图吗
  • activex添加的属性在ie中为何传递不成功
  • 怎么才能获得微软Activex控件的帮助信息呢
  • 如何在单文档中使用ActiveX控件那?

相关文章

  • 2017-06-04 对象释放问题
  • 2017-06-05 dll内类成员变量值丢失!
  • 2017-06-04 看过<<com技术内幕>>(insidecom的朋友请进。
  • 2017-06-05 主线程外加两个辅线程的程序的退出问题!!
  • 2017-06-04 在VC++中如何获得一棵xml树的特定节点中指定属性名的属性值
  • 2017-06-05 在dll中用SetTimer编译报告TimerProc定义错,我按msdn上定义的阿??
  • 2017-06-04 关于Ping组件(COM)在ASP中调用出错!!!!
  • 2017-06-05 有关CreateThread函数的问题!
  • 2017-06-04 ====请插件高手帮忙-==============================
  • 2017-06-05 为什么我创建一个线程占用CPU总是%100?显示菜单都变慢了

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ffdshow设置问题
    • 谁能说说CoInitialize到底干了什么
    • 请高手指教一个错误
    • 求助:socketnotificationsink错误
    • 北京的兄弟请关注
    • 一个创建进程的简单问题
    • 开发IE中的activxocntrol主要用于显示tiff图片,如何实现
    • 如何将一做好的mfc应用程序工程转成dll工程?
    • 关于CWebBrowser2控件代理IP的问题
    • 请问怎样在VC中加载由VC向导创建的DLL动态链接库?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有