2008-09-16 31 views
6

私はCOMとIEのアーキテクチャについて十分に知っているだけで危険です。私はこれに似た作業C#.NET ActiveXコントロールを持っている:IEの.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インターフェースを意味する)を実装すると、オブジェクトが自動化をサポートしていないというエラーが発生します。

答えて

3

まず、呼び出し元のスクリプトに表示されるためには、インターフェイスにComVisible(true)が必要です(これはおそらくエラーの原因になります)。

第2に、 "Microsoft.mshtml"にプロジェクトの.NET参照を追加します。これは、その後

を様々なIE関連のもののためのCOMインターフェイス(ウィンドウ、HTML文書など)をインポートします、あなたはあなたのインターフェースにタイプIHtmlDocument2のプロパティを追加する必要があります。

IHtmlDocument2 Document { set; } 

...あなたのクラスでそれを実装:

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

...あなたいったん...スクリプト

CTIAX.Document = document; 

からそれを呼び出しますドキュメントへの参照が格納されている場合は、自由にそれを使用して、ウィンドウ、他のフレーム、または希望するHTML DOMの任意の部分にアクセスできます。

+0

は、これは、同じGetPropertyメソッドとPutPropertyがSHDocVw.WebBrowserがないことを公開SHDocVw.InternetExplorerへの参照を取得します別の問題で私を助ける答え。しかし、それは私が探しているものではありません。 IHTMLDocument2.parentWindowは、SHDocVw.WebBrowserではなくmshtml.IHTMLWindow2を返します。 私はSHDocVw.WebBrowserを探していますので、BHOと通信するためにGetPropertyメソッドとPutPropertyメソッドにアクセスできます。 –

+0

また、明らかなように、問題の例が機能します。私の例のように実装クラスがComVisibleを指定している場合、ComVisible(true)は必要ではないようです。 IObjectWithSiteなどのCOMインターフェイスを明示的に実装した場合にのみ機能します。 –

1

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

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; 
} 
+1

どのように最初にそのURLを取得しましたか? –

0

あり、シンプルでクリーンな方法は、それを行うには:グッド

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

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

     } 
関連する問題