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

Другие вопросы по тегам