【问题标题】:IWebBrowser2 and multithreaded apartment?IWebBrowser2 和多线程单元?
【发布时间】:2011-04-12 10:09:02
【问题描述】:

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

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

CoInitialize(NULL);

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

CoInitializeEx(NULL, COINIT_MULTITHREADED);

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

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

来自对 IWebBrowser2 方法的调用。

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

【问题讨论】:

  • 为什么需要使用 MTA?
  • 实际上我们不太确定......该应用程序实际上同时使用了 iTunes COM 和 IWebBrowse2 COM,当我们使用 STA 时,除非我们使用 MTA,否则执行似乎是无序的。但是,MTA 似乎破坏了 IWebBrowser2。
  • 你知道你可以用 STA 做多线程吗?
  • 你读过这篇文章codeguru.com/cpp/com-tech/activex/apts/article.php/c5529 吗?也许你只是在解决错误的问题。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我也已经放弃尝试让它在 MTA 中工作。感谢您提到 Chromium Embedded Framework,因为我不知道我们实际上有替代方案在您看来,它与 IWebBrowser2 相比如何?谢谢。
  • 到目前为止,非常好。不过,这取决于您尝试使用它的目的。 IWebBrowser2 公开了许多 Chromium 没有的幕后功能。 Chromium 还会在您的应用程序占用空间中添加 23MB 的 dll,而 IWebBrowser2 是 Windows 附带的。我发现唯一缺少的是无法手动设置缩放级别。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-12-19
    • 2010-10-03
    • 2017-03-19
    • 1970-01-01
    • 2016-07-22
    • 2010-09-30
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多