gpt4 book ai didi

c++ - 为多个 COM 操作初始化 COM

转载 作者:行者123 更新时间:2023-11-30 03:30:43 24 4
gpt4 key购买 nike

在线程中完成任何工作之前每个线程初始化 COM 一次然后使用任意数量的 COM 调用是否是正确的 COM 编码?

例如,在我的工作线程中,我设置了 Volume Shadow Copy Service 并使用了 IFileOperation,在我的 GUI 线程中,我使用 CoCreateInstance 在桌面上创建了快捷方式(CLSID_ShellLink...) 并使用 CoCreateInstance(CLSID_TaskScheduler...) 创建任务计划程序作业。然后,对于所有这些操作,我只需在启动程序和线程时为每个线程调用一次 HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);。最后当然还有 CoUninitialize。

最佳答案

基础知识

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

如果这些是“您的”线程 - 即您控制它们的生命周期,通常在线程函数的开始和结束时进行 CoInitialize/Uninitialize。

这不是你的话题

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

这里有两种方式:

(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)

关于c++ - 为多个 COM 操作初始化 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791276/

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