我有一个multhithreaded应用程序,可以在MTA中工作。它执行outproc对象的调用(让它命名为OUTPROC_OBJ_A),一切正常: 每个线程调用CoInitializeEx(NULL,COINIT_MULTITHREADED)。
但是现在,我还有另外几个com对象坐在dll中 - 我需要在我的应用程序中使用它。让我们命名其中一个INPROC_OBJ_B。他们的穿线模型是公寓穿线。此外,它共享来自OUTPROC_OBJ_A的接口(它使用一些数据作为从.tlb文件导入它的方法的参数)
当我做这样的事情时(在一个线程中):
idl 1:
interface IData : IDispatch
{
}
coclass ConcreteData : IData;
idl 2: (uses idl 1):
interface IOBJ_B : IDispatch
{
void initData([in, out] IData* data);
}
coclass INPROC_OBJ_B : IOBJ_B;
main:
{
CoInitializeEx(NULL, COINIT_MULTITHREADED);
...
{
// 1.) Create instance of INPROC_OBJ_B.
CComPtr<IOBJ_B> pOBJ_B = CreateInstance(INPROC_OBJ_B);
// 2.) Pass to some method of INPROC_OBJ_B some data (For example, pointer to another com object created here.)
CComPtr<IData> pData = CreateInstance(ConcreteData);
pOBJ_B->initData(pData);
// 3.) Here it crashes. Probably on release of pData.
// initData now is empty and does nothing.
}
CoUninitialize();
}
当我这样做时,它有时可以正常工作。但有时,它会因访问冲突而崩溃整个应用程序。有时会抛出object_is_not_connected_exception。
当我用CoInitializeEx中的COINIT_APARTMENTTHREADED替换COINIT_MULTITHREADED时,它可以正常工作。但我无法在我的应用程序中执行此操作 - 整个基础架构都在MTA中。
[更新]:示例中的伪代码更多。
我做错了什么?