gpt4 book ai didi

c++ - 调用 CoInitialize/CoUnInitialize

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:48:09 34 4
gpt4 key购买 nike

我有一个 .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。

您需要寻找崩溃的其他原因。

关于c++ - 调用 CoInitialize/CoUnInitialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19432965/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com