在线程中完成任何工作之前,每个线程初始化COM的COM编码是否正确,然后使用尽可能多的COM调用?
例如,在我的工作线程中,我设置了卷影复制服务并使用 IFileOperation ,在我的GUI线程中,我使用{{1}在桌面上创建了快捷方式使用CoCreateInstance(CLSID_ShellLink...)
创建任务计划程序作业。然后对于所有这些操作,我只需在启动程序和线程时每个线程调用一次CoCreateInstance( CLSID_TaskScheduler...)
。当然,CoUninitialize最终。
答案 0 :(得分:2)
基础知识
需要为每个使用COM的线程调用{p>CoInitialize(Ex)
。
如果这些是“你的”线程 - 即你控制它们的生命周期,那么在线程函数的开头和结尾处使用CoInitialize / Uninitialize是习惯的。
这不是你的主题
如果线程是由其他人创建的,并且您不知道COM是否已初始化(例如,当您的DLL作为插件加载并通过“普通”导出函数调用时),这有点棘手。)< / p>
有两种方法可以到这里:
(a)尝试使用CoInitialize(Ex),并标记返回代码。
(FAILED(hr) == true)
,通常意味着COM库已经初始化,但是线程模型与您请求的线程模型不兼容。如果返回错误,请不调用CoUninitialize (b)创建自己的主题
...并在那里完成所有COM工作(这可能不适用于所有插件API)
OleInitialize与CoInitializeEx
某些Windows API可能需要OleInitialize
,即“CoInitialize plus more”。
没有详细记录哪些服务需要OleInitialize,但我遇到了一些Shell API的问题。
(即使主线程执行OleInitialize,工作线程仍然使用CoInitializeEx
)