COM多线程的疑难杂症(一)

本文详细探讨了在COM多线程环境中遇到的问题,强调了每个线程必须初始化套件的重要性。作者指出,未正确调用CoInitialize(0)和CoUninitialize()会导致组件创建失败。通过分析微软和CSDN的相关文章,解释了线程模型、套件的概念,以及如何避免线程同步问题。同时,讨论了ATL对多线程支持的情况,以及对象引用和成员变量的同步保护策略。
摘要由CSDN通过智能技术生成

    这是COM多线程环境下我所遇到的第一个问题,谨此记录下来已被后忘。

   问题大概这样:

   一位同事在自己的组件中创建线程函数,在线程中调用我组件的方法,结果是间断性的发生CreateInstance失败,经过追查发现,在他的线程函数中开始和结束时没有初始化一个套件,即:没有调用CoInitialize(0)和CoUninitialize()方法,我的组件是CComSingleThreadModel模式,说明每个线程必须要有自己私有的套件。

   首先感谢以下两篇文章:

 

   1。msdn

    全文在http://www.microsoft.com/china/MSDN/library/windev/COMponentdev/CDwickedtoc.mspx?mfr=true 总是调用 CoInitialize(Ex) 几个月前,我收到了一封朋友的电子邮件,他就职于一家著名的硬件公司。他的公司编写了一个非常复杂的基于 COM 的应用程序,其中使用了许多进程内和本地(进程外)的 COM 组件。在开始时,应用程序创建了 COM 对象以服务于运行在多线程单元 (MTA) 中的各种客户端线程。该对象还可以托管给 MTA,这意味着接口指针可以在客户端线程之间自由交换。在测试中,我的朋友发现在应用程序准备关闭之前,一切都进行得不错。然后,不知是什么原因,对 Release 的调用(必须执行此调用,以便正确释放客户端占用的接口指针)被锁定了。他的问题是:“到底是哪里出了问题?” 其实答案非常简单。应用程序的开发人员其他都做得很对,只有一点例外,而这点又非常重要:他们没有在所

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值