2010-09-14 8 views
2

Je développe une application Windows avec le contrôle WebBrowser (IWebBrowser2) intégré.IWebBrowser2 et appartement multithread?

Les choses semblent bien si j'initialiser appartement COM comme un seul thread:

CoInitialize(NULL); 

Cependant, si je change pour être multithread:

CoInitializeEx(NULL, COINIT_MULTITHREADED); 

alors il commence à échouer partout dans les lieux avec valeur de retour de:

Un appel sortant ne peut pas être effectué car l'application envoie un appel synchrone en entrée.

depuis les appels vers les méthodes IWebBrowser2. Est-ce que quelqu'un peut me dire comment résoudre le problème? Je dois utiliser un appartement multithread comme une exigence. S'il vous plaît aider!

+0

Pourquoi exactement avez-vous besoin d'utiliser MTA? – sharptooth

+0

En fait, nous ne sommes pas si sûrs ... l'application utilise à la fois iTunes COM et IWebBrowse2 COM et lorsque nous utilisons STA, l'exécution semble hors d'usage sauf si nous utilisons MTA. Cependant, MTA casse IWebBrowser2 comme il semble. – TopQ

+0

Vous savez que vous pouvez faire du multi-threading avec STA très bien? – wqw

Répondre

3

Vous ne pouvez pas initialiser un contrôle visual activex dans un appartement multithread.

En théorie, vous pouvez créer un thread séparé, l'initialiser en tant que STA, créer votre interface IWebBrowser2 à cet endroit et le marshaler vers le thread MTA à l'aide de CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream. Cependant, il est dégoûtant et je ne recommanderais pas d'essayer si vous voulez échapper à votre santé mentale intacte.

J'ai passé plusieurs jours à regarder ce problème précis et ai abandonné le dégoût (et utilisé Chromium Embedded Framework au lieu de cela).

Déterminez si vous avez vraiment besoin d'utiliser MTA. Les chances sont que vous ne faites pas, vous faites juste quelque chose de mal avec iTunes.

+0

Moi aussi, j'ai renoncé à essayer de le faire fonctionner dans MTA. Merci d'avoir mentionné Chrome Embedded Framework car je n'avais aucune idée que nous avions une alternative Comment est-il comparé à IWebBrowser2 dans vos opinions? Merci. – TopQ

+0

Jusqu'à présent, excellent. Cela dépend cependant de ce que vous essayez de l'utiliser. IWebBrowser2 expose beaucoup de fonctionnalités de jouer dans les coulisses que Chromium ne fonctionne pas. Chrome ajoute également 23 Mo de dll à votre empreinte applicative, tandis que IWebBrowser2 est livré avec Windows. La seule chose qui me manque est l'impossibilité de régler manuellement le niveau de zoom. – JamesT

-1

J'ai passé une semaine entière à essayer ces STA et MTA et a donné up.Instead il y a un approach.Use plus simple le système (« call iexplore.exehttp://www.example.com »); Cela fonctionne très bien. Seul le problème est ceci crée le navigateur Web sur une étiquette distincte . Je pense que ces complications ou intentionnellement (ou idiotically) créées par des chercheurs de Microsoft ainsi que nous venons toujours dans les cercles et se rappellent de Microsoft à chaque approche de nos codings. salutations kvinvisibleguy