2010-09-14 2 views
2

Я разрабатываю приложение Windows с управлением WebBrowser (IWebBrowser2).IWebBrowser2 и многопоточная квартира?

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

CoInitialize(NULL); 

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

CoInitializeEx(NULL, COINIT_MULTITHREADED); 

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

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

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

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

+0

Почему именно вам нужно использовать MTA? – sharptooth

+0

На самом деле мы не так уверены ... на самом деле приложение использует как iTunes COM, так и IWebBrowse2 COM, и когда мы используем STA, выполнение кажется неработоспособным, если мы не используем MTA. Однако MTA ломает IWebBrowser2, как кажется. – TopQ

+0

Вы знаете, что вы можете делать многопоточность с помощью STA просто отлично? – wqw

ответ

3

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

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

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

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

+0

Я тоже отказался от попыток заставить его работать в MTA. Спасибо, что упомянул Chromium Embedded Framework, поскольку я понятия не имел, что у нас есть альтернатива. Как это сравнивается с IWebBrowser2 в ваших мнениях? Благодарю. – TopQ

+0

Пока, отлично. Это зависит от того, что вы пытаетесь использовать для этого. IWebBrowser2 предоставляет множество функций для игры за кулисами, которые Chromium не делает. Chromium также добавляет 23 МБ DLL к вашей области приложения, тогда как IWebBrowser2 поставляется с Windows. Единственное, чего мне не хватало, это неспособность вручную установить уровень масштабирования. – JamesT

-1

Я провел один целую неделю, пытаясь эти STA и MTA и дал up.Instead есть более простой approach.Use система («call iexplore.exehttp://www.example.com»); метод в пределах . Метод button_click.Это работает красиво. Единственная проблема заключается в том, что это создает веб-браузер на отдельном теге . Я думаю об этих осложнениях или намеренно (или идиотски), созданных исследователями Microsoft, чтобы мы всегда приходили в круги и помнили, что Microsoft каждый подход наших кодировок. приветствует kvinvisibleguy

Смежные вопросы