C++ 使用TChromium(CEF3)时,CoInitializeSecurity无法成功

C++ 使用TChromium(CEF3)时,CoInitializeSecurity无法成功,c++,delphi,c++builder,C++,Delphi,C++builder,我有一个运行chromium客户端浏览器的应用程序,有时我需要执行WMI代码来访问一些设备信息,但每次都失败。仅当应用程序未使用TChromium对象时,它才起作用。可能的TChromium(CEF3)初始化COM库,并且当前线程上只允许有一个实例。我读到应用程序应该使用Conit_APARTMENTTHREADED的CoInitializeX,而不是CoInitialize 在一个应用程序中使用TChromium(CEF3)时,是否可以访问COM库并共同初始化安全性?如果是,怎么做 以下是我想

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

在一个应用程序中使用TChromium(CEF3)时,是否可以访问COM库并共同初始化安全性?如果是,怎么做

以下是我想要实现的目标:

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次<每个线程可以多次调用code>CoInitialize/Ex()(对于每个成功的
CoInitialize/Ex()
调用,都会调用相应的
ConInitialize()
),但COM只会在第一次调用时初始化,如果COM已在调用线程上初始化,则后续调用将返回
S_FALSE
RPC_E_CHANGED_MODE


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

谢谢!您的应用程序非常出色。很值得检查Chromium库是否初始化COM。如果它这样做了,这是一个错误,应该报告。