为多个COM操作初始化COM

时间:2017-06-27 23:05:03

标签: c++ com

在线程中完成任何工作之前,每个线程初始化COM的COM编码是否正确,然后使用尽可能多的COM调用?

例如,在我的工作线程中,我设置了卷影复制服务并使用 IFileOperation ,在我的GUI线程中,我使用{{1}在桌面上创建了快捷方式使用CoCreateInstance(CLSID_ShellLink...)创建任务计划程序作业。然后对于所有这些操作,我只需在启动程序和线程时每个线程调用一次CoCreateInstance( CLSID_TaskScheduler...)。当然,CoUninitialize最终。

1 个答案:

答案 0 :(得分:2)

基础知识

需要为每个使用COM的线程调用{p> CoInitialize(Ex)

如果这些是“你的”线程 - 即你控制它们的生命周期,那么在线程函数的开头和结尾处使用CoInitialize / Uninitialize是习惯的。

这不是你的主题

如果线程是由其他人创建的,并且您不知道COM是否已初始化(例如,当您的DLL作为插件加载并通过“普通”导出函数调用时),这有点棘手。)< / p>

有两种方法可以到这里:

(a)尝试使用CoInitialize(Ex),并标记返回代码。

  • S_OK表示您初始化了com库,需要调用CoUninitialize
  • S_FALSE表示已使用兼容的线程模型初始化COM库,但您仍需要调用CoUninitialize(以“反击”)您的CoInitialue
  • 错误代码(FAILED(hr) == true),通常意味着COM库已经初始化,但是线程模型与您请求的线程模型不兼容。如果返回错误,请调用CoUninitialize

(b)创建自己的主题
...并在那里完成所有COM工作(这可能不适用于所有插件API)

OleInitialize与CoInitializeEx

某些Windows API可能需要OleInitialize,即“CoInitialize plus more”。

没有详细记录哪些服务需要OleInitialize,但我遇到了一些Shell API的问题。 (即使主线程执行OleInitialize,工作线程仍然使用CoInitializeEx