使用 TChromium (CEF3) 时 CoInitializeSecurity 无法成功
CoInitializeSecurity cannot succeeded when using TChromium (CEF3)
我有一个 运行 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()
每个线程可以调用多次(每个 成功 CoInitialize/Ex()
调用相应的 CoUninitialize()
调用),但 COM 只会在第一次调用,如果 COM 已经在调用线程上初始化,后续调用将 return S_FALSE
或 RPC_E_CHANGED_MODE
。
要解决您的问题,请尝试将您的 WMI 代码移动到一个单独的工作线程,然后您可以完全控制要如何为该线程初始化 COM,完全独立于 COM 在主线程上的初始化方式 UI 线程。让您的主线程在需要时创建 WMI 线程并等待它终止,然后 WMI 线程可以查询设备信息并将其传递回主线程。
我有一个 运行 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()
每个线程可以调用多次(每个 成功 CoInitialize/Ex()
调用相应的 CoUninitialize()
调用),但 COM 只会在第一次调用,如果 COM 已经在调用线程上初始化,后续调用将 return S_FALSE
或 RPC_E_CHANGED_MODE
。
要解决您的问题,请尝试将您的 WMI 代码移动到一个单独的工作线程,然后您可以完全控制要如何为该线程初始化 COM,完全独立于 COM 在主线程上的初始化方式 UI 线程。让您的主线程在需要时创建 WMI 线程并等待它终止,然后 WMI 线程可以查询设备信息并将其传递回主线程。