代码之家  ›  专栏  ›  技术社区  ›  Ben

IE中的.NET ActiveX组件-如何获取浏览器引用

  •  6
  • Ben  · 技术社区  · 16 年前

    我承认我对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());  
    

    如何在CTIActix中获取对客户端站点(浏览器窗口)的引用?我在bho中通过实现iobjectwithsite实现了这一点,但我不认为这是activex控件的正确方法。如果我在ctiactivex上实现任何接口(我的意思是像iobjectwithsite这样的com接口),当我尝试用javascript实例化时,会得到一个错误,对象不支持自动化。

    3 回复  |  直到 12 年前
        1
  •  3
  •   jlew    16 年前

    首先,您的接口需要comvisible(true)才能被调用脚本看到(这可能是导致错误的原因)。

    其次,将项目中的.netreference添加到“microsoft.mshtml”。这将为各种与ie相关的东西(windows、html文档等)导入com接口。

    然后,需要将ihtmldocument2类型的属性添加到接口:

    IHtmlDocument2 Document { set; }
    

    …在课堂上实施:

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

    …从脚本中调用

    CTIAX.Document = document; 
    

    …一旦存储了对文档的引用,就可以随意使用它来访问窗口、其他框架或您希望的html dom的任何部分。

        2
  •  1
  •   Ben    16 年前

    我找到了一个可行的解决办法。这并不理想,因为它依赖于匹配ie窗口的位置url来获得正确的容器,但它确实有效。在我的例子中,我对查询字符串使用了一个特殊的值,以确保得到正确的窗口。

    这将获取对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;
    }
    
        3
  •  0
  •   MarcoM    12 年前

    有一个简单而干净的方法:

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