我有一个使用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时会出现一些间歇性崩溃。
如果有人可以帮助我。
答案 0 :(得分:1)
如果你在.NET中使用SetApartmentState标记为STA的线程使用它,则不需要这样做。
如果你直接在UI线程上调用它(即:主Windows窗体或WPF线程),这将为你完成。
答案 1 :(得分:1)
不,CoInitializeEx()必须始终由线程所有者调用。哪个从不是组件本身,它没有启动线程。只有业主才能确定哪种公寓类型是正确的,因为它需要照顾公寓保证。特别是,STA线程必须泵送消息循环。组件永远不能提供这种保证。
这在.NET应用程序中始终如一,CLR始终在允许任何托管代码在线程上运行之前调用CoInitializeEx()。公寓类型由启动线程的Main()入口点上的[STAThread]或[MTAThread]选择,工作线程的Thread.SetApartmentState()调用。 Threadpool线程总是加入MTA。
你需要寻找崩溃的另一个原因。