在COM中将数据从MTA传递到STA的正确方法是什么,反之亦然

时间:2015-11-14 11:33:05

标签: c++ multithreading winapi com ipc

我有一个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中。

[更新]:示例中的伪代码更多。

我做错了什么?

0 个答案:

没有答案