我正在开发嵌入了WebBrowser控件(IWebBrowser2
)的Windows应用程序。
如果我将COM单元初始化为单线程,那么事情看起来很好:
CoInitialize(NULL);
但是,如果我将其更改为多线程:
CoInitializeEx(NULL, COINIT_MULTITHREADED);
然后它的所有地方开始失败,返回值为:
由于应用程序正在调度输入同步调用,因此无法进行传出呼叫。
从调用IWebBrowser2方法。
有人可以告诉我如何解决这个问题?我必须使用多线程公寓作为要求。请帮忙!
答案 0 :(得分:3)
您无法在多线程单元中初始化可视activex控件。
理论上,您可以创建一个单独的线程,将其初始化为STA,在那里创建IWebBrowser2接口,并使用CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream将其编组到MTA线程。然而,这是令人作呕的,我不建议尝试它,如果你想完全逃脱你的理智。
我花了几天的时间来研究这个确切的问题并且厌恶地放弃了(并且在发生时使用了Chromium Embedded Framework)。
确定您是否真的需要使用MTA。你可能没有,你只是做错了iTunes。
答案 1 :(得分:-1)
我花了整整一周时间尝试这些STA
和MTA
并放弃了。相反,有一种更简单的方法。使用系统(“call iexplore.exe
http://www.example.com”) ;内部方法
一个button_click
方法。这是美丽的工作。唯一的问题是这会创建一个单独的Web浏览器
我认为这些并发症或者是由微软研究人员有意识地(或者是愚蠢地)创造出来的,这样我们总是会在我们编码的每一种方法中都出现并记住微软。
问候
kvinvisibleguy