1

私は現在、現在のタブの内容を取得して操作できるはずの C# で IE ツールバー ボタンを開発しています。ただし、ボタンがクリックされるたびに、 IObjectWithSite.SetSite 関数が呼び出され (私のコードは最後に投稿されます)、次のエラーが返されます。

タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ SHDocVw.IWebBrowser2' にキャストできません。IID のインターフェイスに対する COM コンポーネントでの QueryInterface 呼び出しが原因で、この操作は失敗しました '

この関数は、サイトが読み込まれると正しく機能しますが、ツールバーのボタンがクリックされたときにのみこのエラーがスローされます。前に述べたように、SetSite 関数が呼び出され、次に IOleCommandTarget.Exec 関数が呼び出されます。

私の質問は、SetSite 関数に渡されるオブジェクトをキャストして、Internet Explorer が現在開いているタブのドキュメントにアクセスできるようにするにはどうすればよいかということだと思います。

これらの 2 つの関数に関連する現在のコードは次のとおりです。

int IObjectWithSite.SetSite(object site)
{
    String display = "";

    try { browser = (IWebBrowser2)site;}
    catch (Exception e) { display += e.Message + "\r\n"; }

    System.Windows.Forms.MessageBox.Show(display);

    return 0;
}


int IOleCommandTarget.Exec(IntPtr pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
    if (form == null)
    {
        form = new SomeForm();
        form.InputText = "";
    }
    form.ShowDialog();
    return 0;
}

前もって感謝します。

4

2 に答える 2

1

ツールバー ボタン サイトから IWebBrowser2 をクエリする文書化された方法は、サイトから IServiceProvider をクエリし、次に IID_IWebBrowserApp の QueryService をクエリすることです

于 2011-05-20T20:53:30.680 に答える
0

Exec関数は、実際に実行する前にSetSiteを呼び出します。これを回避し、Exec関数がブラウザに関する情報にアクセスできるようにするには、SetSite関数とGetSite関数が、Exec関数がアクセスする別のクラスに存在する必要があります。

于 2011-05-30T20:38:46.303 に答える