我有一个.NET应用程序,该应用程序正在使用COM Interop使用COM组件,该组件实例化,并且接口(interface)指针在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时出现间歇性崩溃。

如果有人可以在这里帮助我。

最佳答案

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

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

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

09-06 11:29