【问题标题】:Calling CoInitialize/CoUnInitialize调用 CoInitialize/CoUnInitialize
【发布时间】:2013-10-26 07:28:49
【问题描述】:

我有一个 .NET 应用程序,它使用 COM 互操作的 COM 组件,组件实例化自身,接口指针在 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 时出现了一些间歇性崩溃。

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

【问题讨论】:

    标签: c++ com atl


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢您的回答
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 2015-07-13
    • 1970-01-01
    • 2011-04-11
    • 2021-10-30
    • 1970-01-01
    • 2018-06-25
    • 2014-12-31
    相关资源
    最近更新 更多