COM连接点在多线程中使用的注意事项

48 篇文章 0 订阅

   用vc 写了个支持连接点的COM程序(dll),该COM程序为多线程,其中一个工作线程在任务完成后会通过连接点发送事件实现回调。关于如何写支持连接点的COM程序,请参考vc知识库的杨老师专栏的这篇文章:http://www.vckbase.com/document/viewdoc/?id=1538,杨老师关于COM开发与应用的文章都很不错,值得一看!

    该COM dll写好后,用vb程序调用,并写好事件回调的函数:

 

    结果在运行时总是抛异常,回调函数不能正常被调用。后来google才知道这是多线程的问题,微软曾针对这个问题专门提供了解决方案,请看这篇文章:http://support.microsoft.com/kb/280512。在写COM代码时,将IDE自己生成的连接点基类中的IConnectionPointImpl改为IConnectionPointImplMT(定义在微软提供的头文件ATLCPImplMT.h中),并按文章所述修改相关代码。特别要注意的是在工作线程(执行回调函数的线程)中初始化COM时一定要调用CoInitializeEx(NULL, COINIT_MULTITHREADED),否则回调函数还是无法正确执行的。修改后,vb中的objCom_OperationDone就能被正确调用了。

 

    注意:要VB调用时才需要这么改,如果在VC中调用,这么修改反而会出现异常。如果是供C#调用,改与不改都能正常调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值