6

私は、COM と IE のアーキテクチャについて、危険であるというだけの十分な知識を持っていることを認めます。次のような C# .NET ActiveX コントロールが動作しています。

using System;
using System.Runtime.InteropServices;
using BrowseUI;
using mshtml;
using SHDocVw;
using Microsoft.Win32;

    namespace CTI
    {
        public interface CTIActiveXInterface
        {
            [DispId(1)]
            string GetMsg();
        }

        [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
        public class CTIActiveX : CTIActiveXInterface
        {

            /*** Where can I get a reference to SHDocVw.WebBrowser? *****/
            SHDocVw.WebBrowser browser;

            public string GetMsg()
            {
                return "foo";
            }
        }
    }

regasm を使用してタイプ ライブラリを登録および作成しました。

regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase

そして、これをjavascriptで正常にインスタンス化できます:

var CTIAX = new ActiveXObject("CTI.CTIActiveX");
alert(CTIAX.GetMsg());  

CTIActiveX 内でクライアント サイト(ブラウザ ウィンドウ)への参照を取得するにはどうすればよいですか。IObjectWithSite を実装して BHO でこれを実行しましたが、これが ActiveX コントロールの正しいアプローチだとは思いません。Javascript でインスタンス化しようとしたときに CTIActiveX にインターフェイス (IObjectWithSite のような COM インターフェイスを意味します) を実装すると、オブジェクトが自動化をサポートしていないというエラーが表示されます。

4

3 に答える 3

4

まず、呼び出し元のスクリプトから見えるようにするには、インターフェイスに ComVisible(true) が必要です (これがおそらくエラーの原因です)。

次に、プロジェクトの .NET 参照を "Microsoft.mshtml" に追加します。これにより、さまざまな IE 関連のもの (ウィンドウ、HTML ドキュメントなど) の COM インターフェイスがインポートされます。

次に、タイプ IHtmlDocument2 のプロパティをインターフェイスに追加する必要があります。

IHtmlDocument2 Document { set; }

...クラスに実装します:

public IHtmlDocument2 Document
{
  set { _doc = value;}
}

...スクリプトから呼び出す

CTIAX.Document = document; 

...ドキュメントへの参照を保存したら、それを使用して、ウィンドウ、他のフレーム、または HTML DOM の任意の部分にアクセスできます。

于 2008-09-16T17:55:48.203 に答える
1

私は実行可能な解決策を見つけました。正しいコンテナを取得するためにIEウィンドウのロケーションURLを一致させることに依存しているため、理想的ではありませんが、機能します。私の場合、クエリ文字列に特別な値を使用して、正しいウィンドウが表示されるようにしています。

これにより、SHDocVw.InternetExplorerへの参照が取得されます。SHDocVw.InternetExplorerは、SHDocVw.WebBrowserと同じGetPropertyおよびPutPropertyを公開します。

private InternetExplorer GetIEWindow(string url)
{
    SHDocVw.ShellWindowsClass sh = new ShellWindowsClass();
    InternetExplorer IE;

    for (int i = 1; i <= sh.Count; i++)
    {
        IE = (InternetExplorer)sh.Item(i);
        if (IE != null)
        {
            if (IE.LocationURL.Contains(url))
            {
                return IE;
            }
        }
    }

    return null;
}
于 2008-09-16T19:25:03.077 に答える
0

それを行うためのシンプルでクリーンな方法があります:

public void GetBrowser()
        {

            ShellWindows m_IEFoundBrowsers = new ShellWindows();

            foreach (InternetExplorer Browser in m_IEFoundBrowsers)
            {
                webBrowser = (SHDocVw.WebBrowser) Browser;
                 // do what you want ...
            }

        }
于 2012-05-02T15:38:55.737 に答える