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