2

我正在开发一个IWebBrowser2嵌入了 WebBrowser 控件 ( ) 的 Windows 应用程序。

如果我将 COM 单元初始化为单线程,情况看起来不错:

CoInitialize(NULL);

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

CoInitializeEx(NULL, COINIT_MULTITHREADED);

然后它开始在所有地方失败,返回值为:

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

从调用 IWebBrowser2 方法。

有人可以告诉我如何解决这个问题吗?我必须使用多线程单元作为要求。请帮忙!

4

2 回答 2

3

您无法在多线程单元中初始化可视 Activex 控件。

从理论上讲,您可以创建一个单独的线程,将其初始化为 STA,在那里创建您的 IWebBrowser2 接口并使用 CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream 将其编组到 MTA 线程。但是,这令人作呕,如果您想完好无损地逃脱,我不建议您尝试它。

我花了几天时间研究这个确切的问题并厌恶地放弃了(并在它发生时使用了 Chromium Embedded Framework)。

确定您是否真的需要使用 MTA。很有可能你没有,你只是在 iTunes 上做错了。

于 2010-10-19T11:40:41.673 回答
-1

我花了整整一周的时间尝试这些STAMTA放弃了。取而代之的是一种更简单的方法。使用系统(“ call iexplore.exe http://www.example.com ”);方法中的button_click方法。这很好用。唯一的问题是这会在单独的标签上创建 Web 浏览器。我认为这些复杂性或由微软研究人员故意(或愚蠢地)创建,因此我们总是绕着圈子并在每一种方法中记住微软我们的编码。问候 kvinvisibleguy

于 2012-12-25T02:57:25.673 回答