c++ - 使用 Chromium (CEF 3) 时 CoInitializeSecurity 无法成功

标签 c++ delphi c++builder

我有一个运行 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 ...
   }

最佳答案

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

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

关于c++ - 使用 Chromium (CEF 3) 时 CoInitializeSecurity 无法成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55732963/

相关文章:

c++ - 通过clang++的-finstrument-functions : how to ignore internal std library calls?进行C++功能检测

c# - 通过 ComVisible DLL 访问 SSL 加密的 WebResource 失败

c++ - try catch __finally 在 C++ Builder 中使用

c++ - 是否可以反编译 C++ Builder exe? C++ Builder exe 安全吗?

c++ - 集合中元素的数量(不是总数)

c++ - 到达选项 0 时,如何停止循环返回菜单

c++ - 我需要帮助编写一个为两个函数接受两个参数的 C++ 程序吗?

Delphi:让复制/粘贴工作

delphi - 如何在没有 DISQLite3Api.pas 的情况下使用 DISQLite

c++ - 在 C++ 构建器中从 Unicode 字符串传输的 AnsiString 和 AnsiString 的区别