【问题标题】:Make IWebBrowser2 Control safe for scripting使 IWebBrowser2 控件对脚本安全
【发布时间】:2011-07-04 08:01:29
【问题描述】:

我在我的应用程序中使用 IWebBrowser2 控件来显示外部网页。 问题是对象对于脚本来说是不安全的,并且对 get_Document 的调用失败(返回值是 S_FALSE)。

我实现了一个新类 IScriptableWebBrowser2,它继承自 IWebBrowser2 和 IObjectSafety,并尝试使用它来代替 IWebBrowser2,但没有成功。

如何使我的 IWebBrowser2 控件对脚本安全?

class IScriptableWebBrowser2 : 
   public CComObjectRootEx<CComSingleThreadModel>,
   public IWebBrowser2,
   public IObjectSafety
{
BEGIN_COM_MAP(IScriptableWebBrowser2)
   COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()

    // IObjectSafety implementation
    STDMETHODIMP GetInterfaceSafetyOptions(REFIID riid, 
                                           DWORD *pdwSupportedOptions, 
                                           DWORD *pdwEnabledOptions )
    {
        *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | 
                               INTERFACESAFE_FOR_UNTRUSTED_DATA;
        *pdwEnabledOptions = *pdwSupportedOptions;
        return S_OK;
    }
    STDMETHODIMP SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD     dwEnabledOptions)
    {
        return S_OK;
    }
};

【问题讨论】:

    标签: winapi iwebbrowser2


    【解决方案1】:

    我猜你在一个线程中创建了浏览器并将其传递给另一个线程。
    如果是这种情况,您应该这样做:

    在将IWebBrowser2 实例传递给另一个线程之前,在创建线程中调用CoMarshalInterThreadInterfaceInStream,这会将其编组(转换)为线程安全的IStream 对象,然后才将其传递给tagert 线程.
    稍后,在目标线程中,您应该使用先前编组的 IStream 实例调用 CoGetInterfaceAndReleaseStream,这会将其解组回目标线程中的原始对象(并沿途释放 IStream 对象)。

    CoMarshalInterThreadInterfaceInStream in MSDN
    CoGetInterfaceAndReleaseStream in MSDN

    希望对您有所帮助。

    【讨论】:

    • 您好,感谢您抽出宝贵时间回答,但我正在从同一个线程访问 IWebBrowser2。
    【解决方案2】:

    好吧,我终于有时间回到这个了..

    如果在页面完全加载之前调用 get_Document 会失败,但返回值 (S_FALSE) 表示完全不同的错误(“脚本不安全”)

    顺便说一句,加载本地页面将为您提供理想的行为。

    因此,在页面加载后调用 get_Document(DISPID_NAVIGATECOMPLETE2、DISPID_DOWNLOADCOMPLETE、DISPID_DOCUMENTCOMPLETE)就可以了。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2022-06-15
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多