【问题标题】:CoInitializeSecurity cannot succeeded when using TChromium (CEF3)使用 TChromium (CEF3) 时 CoInitializeSecurity 无法成功
【发布时间】:2019-04-17 17:19:59
【问题描述】:

我有一个运行 chromium 客户端浏览器的应用程序,有时我需要执行 WMI 代码来访问一些设备信息,但每次都失败。它仅在应用程序不使用 TChromium 对象时工作。可能的 TChromium(CEF3) 初始化 COM 库,当前线程上只允许一个实例。我读到应用程序应该使用 CoInitializeEx 和 COINIT_APARTMENTTHREADED 而不是 CoInitialize。

在一个应用程序中使用 TChromium (CEF3) 时是否可以访问 COM 库和 CoInitializeSecurity?如果是,怎么做?

以下是我想要达到的目标:

CoUninitialize();
   CoInitialize(NULL);
   if(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) == S_OK)
   { 
    // cannot get here, CoInitializeSecurity fails
     ... need to execute WMI code using IWbemLocator, IWbemServices ...
   }

【问题讨论】:

  • 非常值得检查 Chromium 库是否初始化了 COM。如果是这样,那就是一个错误,应该报告。

标签: c++ delphi c++builder


【解决方案1】:

COM 每个线程只能初始化 1 次。 CoInitialize/Ex() 可以在每个线程中调用多次(每个成功 CoInitialize/Ex() 调用对应的CoUninitialize() 调用),但COM 只会在第一次调用时初始化,后续调用将返回S_FALSERPC_E_CHANGED_MODE 如果 COM 已在调用线程上初始化。

要解决您的问题,请尝试将您的 WMI 代码移至单独的工作线程,然后您可以完全控制您希望如何为该线程初始化 COM,这与在主 UI 线程上初始化 COM 的方式完全分开。让您的主线程在需要时创建 WMI 线程并等待它终止,然后 WMI 线程可以查询设备信息并将其传递回主线程。

【讨论】:

  • 谢谢!你太棒了。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2016-11-14
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多