2010-09-14 41 views
2

我正在开发一个嵌入了WebBrowser控件(IWebBrowser2)的Windows应用程序。IWebBrowser2和多线程的公寓?

事情看起来好,如果我初始化COM公寓作为单线程:

CoInitialize(NULL); 

但是,如果我将其更改为多线程:

CoInitializeEx(NULL, COINIT_MULTITHREADED); 

然后开始失效与各地的地方返回值:

由于应用程序正在调度输入同步调用,因此无法进行传出呼叫。

从调用IWebBrowser2的方法。

有人可以告诉我怎么解决这个问题吗?我必须使用多线程的公寓作为要求。请帮忙!

+0

到底为什么你需要使用MTA? – sharptooth 2010-09-15 05:04:38

+0

其实我们并不确定...应用程序实际上同时使用了iTunes COM和IWebBrowse2 COM,当我们使用STA时,除非我们使用MTA,否则执行看起来不顺畅。但是,MTA似乎打破了IWebBrowser2。 – TopQ 2010-09-15 08:26:34

+0

你知道你可以用STA做多线程吗? – wqw 2010-09-15 17:26:02

回答

3

无法初始化多线程单元可视ActiveX控件。

理论上,您可以创建一个单独的线程,将其初始化为STA,在那里创建IWebBrowser2接口,并使用CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream将其封送到MTA线程。然而,这很令人讨厌,我不建议尝试一下,如果你想以完整的理智逃脱。

我花了好几天在看这个确切的问题和厌恶(和使用铬嵌入式框架,而不是因为它发生)放弃了。

工作,你是否真的需要使用MTA。你可能没有机会,你只是在iTunes上做错了什么。

+0

我也放弃了试图让它在MTA中工作。感谢提到Chromium嵌入式框架,因为我没有任何线索,我们实际上有另一种选择它与IWebBrowser2在你的意见中相比如何?谢谢。 – TopQ 2010-10-19 17:51:39

+0

到目前为止,出色。这取决于你正在尝试使用它。 IWebBrowser2公开了很多在Chromium不支持的场景中播放的功能。 Chromium还为您的应用程序占用空间增加了23MB的dll,而IWebBrowser2随Windows一起提供。我发现唯一缺乏的是无法手动设置缩放级别。 – JamesT 2010-10-20 12:51:01

-1

我花了整整一个星期,尝试这些STAMTA,给up.Instead还有一个更简单approach.Use系统(“call iexplore.exehttp://www.example.com”);内 一个button_click method.This方法工作beatifully.Only问题是这会在Web浏览器上的单独 tag.I认为由微软研究人员创建了这些并发症或故意(或白痴),以便我们一直都是以圆形和记得微软我们编码的每一种方法。 问候 kvinvisibleguy

相关问题