调用CoInitialize / CoUnInitialize

时间:2013-10-17 17:03:53

标签: c++ com atl

我有一个使用COM组件的COM组件的.NET应用程序,组件本身和接口指针在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时会出现一些间歇性崩溃。

如果有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

如果你在.NET中使用SetApartmentState标记为STA的线程使用它,则不需要这样做。

如果你直接在UI线程上调用它(即:主Windows窗体或WPF线程),这将为你完成。

答案 1 :(得分:1)

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

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

你需要寻找崩溃的另一个原因。