IWebBrowser2 и многопоточная квартира?
Я разрабатываю приложение для Windows с контролем WebBrowser (IWebBrowser2
) встроенный.
Все выглядит хорошо, если я инициализирую COM-квартиру как однопоточную:
CoInitialize(NULL);
Однако, если я изменю это, чтобы быть многопоточным:
CoInitializeEx(NULL, COINIT_MULTITHREADED);
тогда это начинает терпеть неудачу повсеместно с возвращаемым значением:
Исходящий вызов не может быть выполнен, так как приложение отправляет синхронный входной вызов.
от вызовов методов IWebBrowser2.
Может кто-нибудь подскажите пожалуйста, как так решить проблему? Я должен использовать многопоточные квартиры как требование. Пожалуйста помоги!
2 ответа
Вы не можете инициализировать визуальный элемент управления ActiveX в многопоточной квартире.
Теоретически вы можете создать отдельный поток, инициализировать его как STA, создать там свой интерфейс IWebBrowser2 и перенаправить его в поток MTA, используя CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream. Однако это отвратительно неудобно, и я бы не рекомендовал пробовать это, если вы хотите сбежать со своим здоровым здоровьем.
Я провел несколько дней, глядя на эту проблему, и с отвращением сдался (и вместо этого использовал Chromium Embedded Framework).
Выясните, действительно ли вам нужно использовать MTA. Скорее всего, вы не делаете, вы просто делаете что-то не так с iTunes.
Я провел целую неделю, пытаясь это STA
а также MTA
и сдался. Вместо этого есть более простой подход. Используйте систему ("call iexplore.exe
http://www.example.com/"); метод в пределах button_click
Метод. Это работает красиво. Единственная проблема заключается в том, что веб-браузер создается на отдельном теге. Я думаю, что эти сложности или намеренно (или идиотски) созданы исследователями Microsoft, чтобы мы всегда приходили кругами и помнили Microsoft при каждом подходе наших кодировок. С уважением kvinvisibleguy