2008-09-16 10 views
6

मैं मानता हूं कि मैं केवल COM और IE आर्किटेक्चर के बारे में पर्याप्त खतरनाक होने के बारे में जानता हूं। मैं एक काम कर रहे सी # नेट ActiveX नियंत्रण इस के समान है:आईई में .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 

और सफलतापूर्वक जावास्क्रिप्ट में इस दृष्टांत कर सकते हैं:

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

मैं CTIActiveX के भीतर क्लाइंट साइट (ब्राउज़र विंडो) का संदर्भ कैसे प्राप्त कर सकता हूं? मैंने इसे IObjectWithSite लागू करके बीएचओ में किया है, लेकिन मुझे नहीं लगता कि यह ActiveX नियंत्रण के लिए सही दृष्टिकोण है। यदि मैं जावास्क्रिप्ट में तत्काल प्रयास करने का प्रयास करता हूं तो मैं किसी भी इंटरफ़ेस को लागू करता हूं (मेरा मतलब है IObjectWithSite जैसे COM इंटरफ़ेस) जब मैं जावास्क्रिप्ट में तुरंत चालू करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है कि ऑब्जेक्ट स्वचालन का समर्थन नहीं करता है।

उत्तर

3

सबसे पहले, आपके इंटरफ़ेस को कॉलिंग स्क्रिप्ट द्वारा देखने के लिए कॉमविज़िबल (सत्य) की आवश्यकता होती है (यह शायद त्रुटि उत्पन्न कर रहा है)।

दूसरा, अपने प्रोजेक्ट में .NETreference को "Microsoft.mshtml" में जोड़ें। यह विभिन्न आईई संबंधित चीज़ों (खिड़कियां, HTML दस्तावेज़, आदि)

के लिए COM इंटरफ़ेस आयात करेगा फिर, आप अपने इंटरफेस के प्रकार IHTMLDocument2 की संपत्ति जोड़ने की जरूरत:

IHtmlDocument2 Document { set; } 

... अपनी कक्षा में इसे लागू:

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

... यह स्क्रिप्ट

CTIAX.Document = document; 

से फोन ... एक बार आप दस्तावेज़ के संदर्भ में संग्रहीत किया है, आप खिड़की, अन्य फ्रेम, या एचटीएमएल डोम के किसी भी हिस्से को पाने के लिए इच्छानुसार इसका उपयोग कर सकते हैं।

+0

अच्छा

यह जो एक ही getProperty और PutProperty कि SHDocVw.WebBrowser करता है को उजागर करता है SHDocVw.InternetExplorer के लिए एक संदर्भ, हो जाता है जवाब जो मुझे किसी अन्य समस्या से मदद करता है; हालांकि यह जो मैं खोज रहा हूं वह असाधारण नहीं है। IHTMLDocument2.parentWindow एक mshtml देता है। IHTMLWindow2, SHDocVw.WebBrowser नहीं। मैं SHDocVw.WebBrowser की तलाश में हूं इसलिए मैं बीएचओ के साथ संवाद करने के लिए GetProperty और PutProperty विधियों तक पहुंच सकता हूं। –

+0

इसके अलावा, स्पष्ट होने के लिए, प्रश्न में उदाहरण काम करता है। यदि कार्यान्वयन वर्ग मेरे उदाहरण में कॉमविज़िबल निर्दिष्ट करता है तो कॉमविज़िबल (सत्य) की आवश्यकता नहीं होती है। यह केवल तब टूट जाता है जब मैं स्पष्ट रूप से COM इंटरफ़ेस को कार्यान्वित करता हूं जैसे IObjectWithSite। –

1

मुझे एक व्यावहारिक समाधान मिला है। यह आदर्श नहीं है क्योंकि यह सही कंटेनर प्राप्त करने के लिए आईई विंडो के स्थान यूआरएल से मेल खाने पर निर्भर करता है, लेकिन यह काम करता है। मेरे मामले में मैं यह सुनिश्चित करने के लिए क्वेरी स्ट्रिंग पर एक विशेष मान का उपयोग कर रहा हूं कि मुझे सही विंडो मिलती है।

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

आपको उस यूआरएल को पहली जगह कैसे मिली? –

0
वहाँ

एक सरल और क्लीनर तरीका यह करने के लिए:

public void GetBrowser() 
     { 

      ShellWindows m_IEFoundBrowsers = new ShellWindows(); 

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

     }