2008-09-16 19 views
6

COM ve IE mimarisi hakkında yalnızca tehlikeli olmak için yeterli bilgiye sahip olduğumu kabul ediyorum.IE'de .NET ActiveX Bileşeni - Tarayıcı Başvurusu Nasıl Yapılır

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

Ben kayıtlı ve regasm kullanarak bir tür kitaplığı oluşturuldu::

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

Ve başarıyla javascript bu örneğini:

var CTIAX = new ActiveXObject("CTI.CTIActiveX"); 
alert(CTIAX.GetMsg()); 
Ben buna benzer bir çalışma C# .NET ActiveX denetimi var

CTIActiveX içindeki istemci sitesine (tarayıcı penceresi) nasıl başvuru yapabilirim? Bunu IObjectWithSite kullanarak bir BHO'da yaptım, ancak bunun bir ActiveX denetimi için doğru bir yaklaşım olduğunu düşünmüyorum. Herhangi bir arabirimi (IObjectWithSite gibi COM arabirimi) CTIActiveX üzerinde çalıştırırsam, Javascript'te başlatmaya çalıştığımda, nesnenin otomasyonu desteklemediğine dair bir hata alıyorum.

cevap

3

İlk olarak, çağıran komut dosyası tarafından görülmesi için arabiriminizin ComVisible (true) gerekiyor (bu büyük olasılıkla hatayı veriyor).

İkincisi, projenize "Microsoft.mshtml" için bir .NETreference ekleyin. Bu çeşitli IE ilgili şeyleri (pencere vs HTML belgeleri,)

için COM arabirimleri ithal edecek Daha sonra, arabirime tipi ıhtmldocument2 bir özellik katmak gerekir:

IHtmlDocument2 Document { set; } 

... sınıfındaki uygulamak: ... ...

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

komut

CTIAX.Document = document; 

onu aramak size bir kez Belgeye bir başvuru kaydettiniz, pencereye, diğer karelere veya istediğiniz HTML DOM'ın herhangi bir bölümüne gitmek için bunu kullanabilirsiniz.

+0

Aynı GetProperty ve PutProperty SHDocVw.WebBrowser yaptığı ortaya SHDocVw.InternetExplorer başvuru, alır cevap bana başka bir sorun ile yardımcı olur; Ancak, aradığım şey çok da kötü değil. IHTMLDocument2.parentWindow bir mshtml.IHTMLWindow2 döndürür, SHDocVw.WebBrowser değil. SHDocVw.WebBrowser'ı arıyorum, böylece bir BHO ile iletişim kurmak için GetProperty ve PutProperty yöntemlerine erişebilirim. –

+0

Ayrıca, açık olmak gerekirse, sorudaki örnek işe yaramıyor. Uygulanabilir sınıf benim örneğimde olduğu gibi ComVisible belirtirse, ComVisible (true) gerekli görünmüyor. Sadece IObjectWithSite gibi bir COM arabirimini açıkça uygularsam kırılır. –

1

Çalışılabilir bir çözüm buldum. İdeal değil çünkü doğru kapsayıcıyı almak için IE penceresinin konum URL'sini eşlemeye dayanıyor, ancak işe yarıyor. Benim durumumda, doğru pencereyi aldığımdan emin olmak için sorgu dizesinde özel bir değer kullanıyorum.

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

Bu URL'yi ilk etapta nasıl aldınız? –

0

Orada basit ve daha temiz bir şekilde yapmak: İyi

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

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

     } 
İlgili konular