我的一个类中某个函数调用了一个COM组件的几个函数,工作正常,但在这个类中启动了一个线程,我把this指针传给了这个线程,但在这个线程中调用这个类的那个函数,COM组件调用出错。
可能会是什么问题呢?

解决方案 »

  1.   

    很多com组件都要依附在窗体上面的,就是说你给的指针需要是窗体指针,不过具体要看你是什么com组件
      

  2.   

    在那个线程中也要用COM初始化,只对单个线程有效
    CoInitialize(NULL)
    CoUnInitialize();
      

  3.   

    线程之间传interface指针要用到下面的函数:
    CoMarshalInterThreadInterfaceInStream()
    CoGetInterfaceAndReleaseStream ()
    看MSDN中相关说明也了解更多...
      

  4.   

    laiyiling(陌生人++) 说得对
    应该调用
    CoInitialize(NULL);---进入套间
    CoUnInitialize();---退出套间
      

  5.   

    laiyiling(陌生人++) 说得对
    应该调用
    CoInitialize(NULL);---进入套间
    CoUnInitialize();---退出套间
    这样是不可以的。CoMarshalInterThreadInterfaceInStream()
    CoGetInterfaceAndReleaseStream ()这两个我又是理解不了的,为什么加那些参数?跟Stream没关呀!
      

  6.   

    Cline(营营) 说的对,虽然我没试过,但我知道:《COM线程》
    按照COM对象的执行环境,分为套间线程和自由线程
    1. 套间线程(apartment thread)
       位于一个STA中(Single-Threaded Apartment)
       一个套间对应一个线程
    2. 自由线程(free thread)
       位于MTA中(Multi-Threaded Apartment)
       一个进程有一个MTA,它可以包含任意数量的自由线程《marshaling》
    1. 调用者与被调用者如果位于不同的线程中,则调用过程要有两次线程切换,线程切换也需要用到marshaling机制2. COM对象的线程相依性
       有的COM对象只能在一个线程中运行
       内含UI的COM对象只能在创建线程上运行3.线程之间的marshaling机制与进程间的marshaling过程一致
    --- 潘爱民我摘录的,欢迎探讨。