IWebBrowser2 и многопоточная квартира? - PullRequest
2 голосов
/ 15 сентября 2010

Я занимаюсь разработкой приложения для Windows со встроенным элементом управления WebBrowser (IWebBrowser2).

Все выглядит хорошо, если я инициализирую COM-квартиру как однопоточную:

CoInitialize(NULL);

Однако, если я изменю его на многопоточный:

CoInitializeEx(NULL, COINIT_MULTITHREADED);

затем он начинает терпеть неудачу повсюду с возвращаемым значением:

Исходящий вызов не может быть выполнен, поскольку приложение отправляет синхронный входной вызов.

от вызовов методов IWebBrowser2.

Может кто-нибудь подскажите, пожалуйста, как так решить проблему? Я должен использовать многопоточные квартиры как требование. Пожалуйста, помогите!

Ответы [ 2 ]

3 голосов
/ 19 октября 2010

Вы не можете инициализировать визуальный элемент управления activex в многопоточной квартире.

Теоретически вы можете создать отдельный поток, инициализировать его как STA, создать там свой интерфейс IWebBrowser2 и перенаправить его в поток MTA, используя CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream.Однако это отвратительно неудобно, и я бы не рекомендовал пробовать это, если вы хотите сбежать со своим здоровым здоровьем.

Я провел несколько дней, глядя на эту проблему, и с отвращением сдался (и вместо этого использовал Chromium Embedded Framework.)

Подумайте, действительно ли вам нужно использовать MTA.Скорее всего, вы не делаете, вы просто делаете что-то не так с iTunes.

0 голосов
/ 25 декабря 2012

Я потратил целую неделю, пытаясь эти STA и MTA, и сдался. Вместо этого есть более простой подход. Используйте систему (метод "call iexplore.exe http://www.example.com"); в button_click метод. Это работает красиво. Единственная проблема заключается в том, что это создает веб-браузер на отдельном Я думаю, что эти осложнения или намеренно (или идиотски) созданы исследователями Microsoft, чтобы мы всегда приходили в круги и помнили Microsoft при каждом подходе наших кодировок. С уважением kvinvisibleguy

...