CoInitializeSecurity 在使用 TChromium (CEF3) 时无法成功

CoInitializeSecurity cannot succeeded when using TChromium (CEF3)

本文关键字:成功 CEF3 TChromium CoInitializeSecurity      更新时间:2023-10-16

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

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

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