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

来源:互联网 发布:sql readuncommitted 编辑:程序博客网 时间:2024/05/20 09:23

   用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#调用,改与不改都能正常调用。