生成一个静态对象,多个线程都可以调用该对象。该静态对象创建一个进程外组件。下面举个例子
线程1,首先创建静态对象StaticObject,该对象会创建一个进程外组件ComA,调用ComA的所有方法都成功。
线程2,得到该静态对象StaticObject,然后用该对象中已经创建的组件ComA去调用ComA的方法,但是所有方法都调用失败。
有人知道为什么吗?
检查两次调用所有的指针都是一样的,但是就是线程2就是无法调用ComA的方法,有人知道为什么吗?

解决方案 »

  1.   

    每个线程都需要先执行CoInitializeEx。
      

  2.   

    跟对象没什么关系,每个线程要调用COM都必须先执行CoInitializeEx。
      

  3.   

    试了不行,似乎早就已经CoInitializeEx了。
      

  4.   

    原因很简单,因为COM接口不能随便跨线程传递。
      

  5.   

    线程1,首先创建静态对象StaticObject,该对象会创建一个进程外组件ComA,调用ComA的所有方法都成功。 
    ===>表示COMA的接口属于线程1
    线程2,得到该静态对象StaticObject,然后用该对象中已经创建的组件ComA去调用ComA的方法,但是所有方法都调用失败。
    ===>这样就表示通过线程2访问线程1在COMA方法
    方法1:用GAT表解决跨线程传递COM接口首先当创建一个需要在其他线程使用的COM接口时,把它注册到GlobalInterfaceTableCComPtr<IMyInterface> spMyInterface;
    spMyInterface.CoCreateInstance();
    //register interface in global interface table
    CComPtr<IGlobalInterfaceTable>    spGIT;
    spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
    if (spGIT)
    {
        spGIT->RegisterInterfaceInGlobal(spMyInterface, IID_IMyInterface, &m_dwCookie);
    }注册时会返回一个Cookie,记住这个Cookie,并在任何线程需要使用前面接口时,通过这个Cookie获得接口。CComPtr<IMyInterface>    spMyInterface;
    if (m_dwCookie!=0)
    {
        CComPtr<IGlobalInterfaceTable>    spGIT;
        spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
        if (spGIT)
        {
            spGIT->GetInterfaceFromGlobal(m_dwCookie, IID_IMyInterface, (void**)&spMyInterface.p);
        }
    }
    if (spMyInterface)
    {
    //Call my interface
    }最后,作为一个负责任的程序员,关闭之前一定要注销前面注册的接口。
    if (m_dwCookie!=0)
    {
        CComPtr<IGlobalInterfaceTable>    spGIT;
        spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
        if (spGIT)
        {
            spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
            m_dwCookie = 0;
        }
    }
      

  6.   

    也可以用CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream
      

  7.   

    多谢指点,我们的项目现在不能这么用,无法共同使用cookie。项目里有过类似的组件,可以多线程调用成功,我的却不行。是不是和用VC创建atlobject时选择的属性有关?我选择的是Free,是不是应该选department?
      

  8.   

    我记得Free不管套间里面的线程同步,而department却会管,会不会有问题?多谢!