线程函数A(),使用CreateThread 创建多个A()线程
在A线程中调用了一个自定义组件ocx的一个方法,该方法使用CoCreateInstance创建一个com对象
创建的第一个线程执行该方法多次均正常,但创建的第二个线程执行同样的操作CoCreateInstance时会报错,请高手指点,

解决方案 »

  1.   

    在不同的线程间使用 COM 会出问题的
      

  2.   


      在线程中都初始化COM环境看看。
      

  3.   

    你第一个创建的线程可能为主线程吧,COM组件的主线程 使用没有问题
    但在自由线程里可能就会有问题,初始化COM环境的时候用CoInilizeEx(........)
    在自由线程里没有隐藏的窗口,既没有消息 循环,所以肯定和不一样,我只知道这么多
      

  4.   

    在新的线程中也需要初始化COM,参考:
    http://www.vckbase.com/document/viewdoc/?id=1183
    引:
     总是调用 CoInitialize(Ex) 
      几个月前,我收到了一封朋友的电子邮件,他就职于一家著名的硬件公司。他的公司编写了一个非常复杂的基于 COM 的应用程序,其中使用了许多进程内和本地(进程外)的 COM 组件。在开始时,应用程序创建了 COM 对象以服务于运行在多线程单元 (MTA) 中的各种客户端线程。该对象还可以托管给 MTA,这意味着接口指针可以在客户端线程之间自由交换。在测试中,我的朋友发现在应用程序准备关闭之前,一切都进行得不错。然后,不知是什么原因,对 Release 的调用(必须执行此调用,以便正确释放客户端占用的接口指针)被锁定了。他的问题是:“到底是哪里出了问题?” 
      其实答案非常简单。应用程序的开发人员其他都做得很对,只有一点例外,而这点又非常重要:他们没有在所有的客户端线程中调用 CoInitialize 或 CoInitializeEx。现代 COM 的基本原则之一,就是每个使用 COM 的线程都应该先调用 CoInitialize 或 CoInitializeEx 来初始化 COM。这条原则是无法免除的。除了其他事情以外,CoInitialize(Ex) 应将线程放入单元中,并初始化重要的每线程状态信息(这对于 COM 的正确操作是必需的)。调用 CoInitialize(Ex) 失败通常会在应用程序生命期早期以失败的 COM API 函数的形式表现出来,最常见的是激活请求。但有时问题很隐蔽,直到一切都太晚了(例如对 Release 的调用一去不复返了)才表现出来。当开发小组将 CoInitialize(Ex) 调用添加到所有接触 COM 的线程之后,他们的问题就迎刃而解了。 
      具有讽刺意义的是,Microsoft 竟是 COM 程序员有时不调用 CoInitialize(Ex) 的原因之一。Microsoft 知识库中包含的一些文档中说,调用 CoInitialize(Ex) 对基于 MTA 的线程来说不是必需的(有关示例,请参阅文章 Q150777)。是的,在很多情况下,我们可以跳过 CoInitialize(Ex) 而不会出现问题。但是,这样是不应该的,除非您知道自己在干什么,并且可以绝对肯定自己不会受到负面影响。调用 CoInitialize(Ex) 是没有害处的,因此我建议 COM 程序员始终从某个与 COM 相关的线程中调用它。
      

  5.   

    对,每个线程都要CoInitialize(Ex) !