CoInitializeSecurity не может быть успешным при использовании TChromium (CEF3) - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть приложение, в котором запущен клиентский браузер Chromium, и в какой-то момент мне нужно выполнить код WMI для доступа к некоторой информации об устройстве, но оно каждый раз дает сбой.Работает только тогда, когда приложение не использует объект TChromium.Возможный TChromium (CEF3) Инициализирует библиотеку COM, и в текущем потоке разрешен только один экземпляр.Я читал, что приложение должно использовать CoInitializeEx с COINIT_APARTMENTTHREADED вместо CoInitialize.

Можно ли получить доступ к библиотеке COM и CoInitializeSecurity при использовании TChromium (CEF3) в одном приложении?Если да, то как это сделать?

Ниже приведено то, чего я хочу достичь:

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 Ответ

3 голосов
/ 18 апреля 2019

COM может быть инициализирован только 1 раз на поток.CoInitialize/Ex() можно вызывать несколько раз для каждого потока (с соответствующими CoUninitialize() вызовами для каждого успешного CoInitialize/Ex() вызова), но COM будет инициализирован только при первом вызове, а последующие вызовы будут возвращать либо S_FALSE или RPC_E_CHANGED_MODE, если COM уже инициализирован в вызывающем потоке.

Чтобы решить вашу проблему, попробуйте переместить код WMI в отдельный рабочий поток, тогда вы получите полный контроль над тем, как вы хотите инициализироватьCOM для этого потока полностью отделен от способа инициализации COM в основном потоке пользовательского интерфейса.Попросите ваш основной поток создать поток WMI, когда это необходимо, и дождаться его завершения, тогда поток WMI может запросить информацию об устройстве и передать ее обратно в основной поток.

...