• 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 > 关于在IE中响应ActiveX事件的问题。100分

关于在IE中响应ActiveX事件的问题。100分

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

佚名通过本文主要向大家介绍了 关于在IE中响应ActiveX事件的问题。100分等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于在IE中响应ActiveX事件的问题。100分
描述:

各位好:
   小弟新学ActiveX编程,在MFC Wizzard基础上添加自己的功能,并用Class Wizzard 添加了若干Method和Event。
   我如果通过HTML中的VBScript调用ActiveX控件的Method,然后在Method中
FireXXEvent,一切都正常。通过VBScript能正确响应该事件。
   然而,我用控件内部自己创建的工作线程FireXXEvent时,IE却不能正确
响应该事件,在调试状态,还能看见异常发生,好像是控件内的Invoke
方法没返回正确值。(在TSTCON32中调试时,能看见事件发生)
   我查以往CSDN时,也发现了同类问题,见:
http://expert.csdn.net/Expert/topic/2495/2495556.xml?temp=.8208277
   希望对此有了解的朋友能给点帮助。谢先!


解决方案1:

那是因为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。


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

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

相关文章

  • 2017-06-04 谁能帮我开发一个IE插件,多少钱你说?
  • 2017-06-05 请问怎样让一个进程在按下ctrlaltdelelte时看不到?
  • 2017-06-04 ffmpeg如何支持dshow
  • 2017-06-05 编写Windows服务的问题
  • 2017-06-05 两个线程如何同时启动?
  • 2017-06-05 如何实现将几个视频流写入一个文件
  • 2017-06-05 导出数据到excel
  • 2017-06-04 能否不用proxy/stub,就可以在vb/vc中使用结构
  • 2017-06-05 ===急。急。急===我的线程怎么不运行?????菜鸟问题
  • 2017-06-05 EnterCriticalSection放在普通函数中可以吗?

文章分类

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

最近更新的内容

    • 我写了个gui的扫描器,但是只要多个扫描线程启动后,界面就不能动了,相应不了用户操作
    • 初始化MCI时发生问题
    • 请教关于按钮控件和与Excel等OFFICE软件"沟通"的编程
    • win2000组件服务的问题
    • 简单问题:如何在VC程序中,将一个EXCEL文件打开,并插入一行?
    • 如何获得一个DLL中类的声明文件
    • 托盘右键弹出一对话框//不知道为什么弹出一次可以,第二次要先关闭程序主窗口才可弹出正常,要不就一闪而过
    • 有没有类似WORD的组件啊
    • 新手请教ole编写
    • 关于APIHook的困惑

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

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