2008-09-16 25 views
6

Ich gebe zu, ich weiß genug über COM und IE-Architektur nur um gefährlich zu sein. Ich habe eine funktionierende C# .NET ActiveX-Steuerelement wie folgt aus:.NET ActiveX-Komponente im IE - Wie Browser Referenz

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"; 
      } 
     } 
    } 

ich registriert und eine Typbibliothek mit regasm erstellt:

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

Und kann diese erfolgreich in Javascript instanziiert:

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

Wie kann ich in CTIActiveX einen Verweis auf die Client-Site (Browser-Fenster) erhalten? Ich habe dies in einem BHO getan, indem ich IObjectWithSite implementiert habe, aber ich denke nicht, dass dies der richtige Ansatz für ein ActiveX-Steuerelement ist. Wenn ich irgendeine Schnittstelle (ich meine COM-Schnittstelle wie IObjectWithSite) auf CTIActiveX implementieren, wenn ich versuche, in Javascript zu instanziieren, bekomme ich einen Fehler, dass das Objekt Automatisierung nicht unterstützt.

Antwort

3

Zuerst benötigt Ihre Schnittstelle ComVisible (true), um vom aufrufenden Skript gesehen zu werden (dies verursacht wahrscheinlich den Fehler).

Zweitens, fügen Sie eine .NET Reference in Ihrem Projekt zu "Microsoft.mshtml". Dadurch wird die COM-Schnittstellen für verschiedene IE-bezogene Dinge importieren (Fenster, HTML-Dokumente, etc.)

Dann müssen Sie eine Eigenschaft vom Typ IHTMLDocument2 zu Ihrer Schnittstelle hinzuzufügen:

IHtmlDocument2 Document { set; } 

... implementieren es in Ihrer Klasse:

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

... nennen es aus Skript

CTIAX.Document = document; 

..., wenn Sie Haben Sie einen Verweis auf das Dokument gespeichert, können Sie es nach Belieben verwenden, um zu dem Fenster, anderen Frames oder einem beliebigen Teil des HTML-DOM zu gelangen, den Sie wünschen.

+0

Gut Antwort, die mir bei einem anderen Problem hilft; aber es ist nicht genau was ich suche. IHTMLDocument2.parentWindow gibt ein mshtml.IHTMLWindow2 zurück, nicht SHDocVw.WebBrowser. Ich bin auf der Suche nach SHDocVw.WebBrowser, so kann ich auf die Methoden GetProperty und PutProperty zu kommunizieren mit einem BHO. –

+0

Um das klarzustellen, funktioniert das Beispiel in der Frage auch. ComVisible (true) scheint nicht erforderlich zu sein, wenn die implementierende Klasse ComVisible wie in meinem Beispiel angibt. Es bricht nur, wenn ich explizit eine COM-Schnittstelle wie IObjectWithSite implementieren. –

1

Ich habe eine praktikable Lösung gefunden. Es ist nicht ideal, da es auf die URL des IE-Fensters angewiesen ist, um den richtigen Container zu erhalten, aber es funktioniert. In meinem Fall verwende ich einen speziellen Wert für die Abfragezeichenfolge, um sicherzustellen, dass ich das richtige Fenster bekomme.

Dies ruft einen Verweis auf SHDocVw.InternetExplorer, die die gleiche GetProperty aussetzt und PutProperty dass SHDocVw.WebBrowser tut:

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

Wie hast du diese URL überhaupt bekommen? –

0

Es gibt eine einfache und saubere Art und Weise, es zu tun:

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

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

     } 
Verwandte Themen