2011-07-04 2 views
0

私は、アプリケーションで外部Webページを表示するためにIWebBrowser2コントロールを使用しています。 問題は、オブジェクトがスクリプト化に安全でなく、get_Documentへの呼び出しが失敗したことです(戻り値としてS_FALSEを指定)。IWebBrowser2コントロールのスクリプト作成を安全にする

IWebBrowser2 & IObjectSafetyから継承する新しいクラスのIScriptableWebBrowser2を実装しました。これを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; 
    } 
}; 

答えて

1

まあ、私は最終的に戻ってこれに来ていくつかの時間を持っていた。..

それはあなたが完全にロードされたページの前にそれを呼び出しますが、戻り値(S_FALSE)は完全に異なるエラーを示す場合get_Documentが失敗したことが判明( "スクリプトには安全ではありません")

btw、ローカルページを読み込むと、望ましい動作が得られます。

したがって、ページがロードされた後にget_Document(DISPID_NAVIGATECOMPLETE2、DISPID_DOWNLOADCOMPLETE、DISPID_DOCUMENTCOMPLETE)を呼び出すと、このトリックが実行されます。

これが役に立ちます。

1

あなたはスレッドでブラウザを作成し、別のスレッドに渡したと思います。
その場合は、ここにあなたが何をすべきかです:

作成スレッドで、別のスレッドにIWebBrowser2インスタンスを渡す前に、CoMarshalInterThreadInterfaceInStreamを呼び出し、(変換)マーシャリングします、それがスレッドセーフIStreamオブジェクトに、そしてそれだけをtagertスレッドに渡します。
その後、ターゲットスレッドで以前にマーシャリングされたIStreamインスタンスでCoGetInterfaceAndReleaseStreamを呼び出すと、ターゲットスレッドの元のオブジェクトにアンマーシャリングされます(途中でIStreamオブジェクトが解放されます)。

CoMarshalInterThreadInterfaceInStream in MSDN
CoGetInterfaceAndReleaseStream in MSDN

お役に立てば幸いです。

+0

こんにちは、ありがとうございましたが、私は同じスレッドからIWebBrowser2にアクセスしています。 – Yuval

関連する問題