IWebBrowser2和多线程公寓?

时间:2010-09-14 22:41:23

标签: windows multithreading visual-c++ com iwebbrowser2

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

如果我将COM单元初始化为单线程,那么事情看起来很好:

CoInitialize(NULL);

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

CoInitializeEx(NULL, COINIT_MULTITHREADED);

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

  

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

从调用IWebBrowser2方法。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:-1)

我花了整整一周时间尝试这些STAMTA并放弃了。相反,有一种更简单的方法。使用系统(“call iexplore.exe http://www.example.com”) ;内部方法 一个button_click方法。这是美丽的工作。唯一的问题是这会创建一个单独的Web浏览器 我认为这些并发症或者是由微软研究人员有意识地(或者是愚蠢地)创造出来的,这样我们总是会在我们编码的每一种方法中都出现并记住微软。 问候 kvinvisibleguy