C++ 调用CoInitialize/ConInitialize

C++ 调用CoInitialize/ConInitialize,c++,com,atl,C++,Com,Atl,我有一个.NET应用程序,它使用COM互操作使用COM组件,组件实例本身和接口指针以API cal的形式返回到.NET包装器,在应用程序流的稍后一点调用COM组件 //Pseudo code //CLISD_ITEM is a another CoClass housed by this COM component, the component is a STA based dll HRESULT GetItem(ITem **ptr) { HRESULT hr = CoCreate

我有一个.NET应用程序,它使用COM互操作使用COM组件,组件实例本身和接口指针以API cal的形式返回到.NET包装器,在应用程序流的稍后一点调用COM组件

//Pseudo code 

//CLISD_ITEM is a another CoClass housed by this COM component, the component is a STA based dll 

HRESULT GetItem(ITem **ptr)

{

HRESULT hr = CoCreateInstance(CLSID_ITEM.....,....(void **) &pItem);

pItem->QI(ptr);

}
我的问题是,我应该在函数GetItem中调用CoInitialize和CoUninitialize(),到目前为止,我没有进行这些调用,代码似乎工作正常,但有报告称,在调用CoCreateInstance时会出现一些间歇性崩溃


如果有人能在这里帮助我。

如果您是从.NET中标记为STA的线程使用此功能,您不需要这样做

如果您直接在UI线程(即:主Windows窗体或WPF线程)上调用此操作,则此操作已经为您完成。

否,线程的所有者必须始终调用CoInitializeEx()。这永远不是组件本身,它没有启动线程。只有业主才能确定哪种公寓类型是正确的,因为它需要提供公寓担保。特别是,STA线程必须泵送消息循环。组件永远不能提供这种保证

这在.NET应用程序中是一致的,CLR总是在允许任何托管代码在线程上运行之前调用CoInitializeEx()。单元类型由启动线程的Main()入口点上的[STAThread]或[MTAThread]选择,工作线程的thread.SetApartmentState()调用。线程池线程始终加入MTA


您需要寻找另一个坠机原因。

谢谢您的回答谢谢您的回答