我有一个.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。
您需要寻找崩溃的另一个原因。