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

6 .net c# internet-explorer activex

我承认我对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";
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我使用regasm注册并创建了一个类型库:

regasm CTIActiveX.dll /tlb:CTIActiveXNet.dll /codebase
Run Code Online (Sandbox Code Playgroud)

并且可以在javascript中成功实例化:

var CTIAX = new ActiveXObject("CTI.CTIActiveX");
alert(CTIAX.GetMsg());  
Run Code Online (Sandbox Code Playgroud)

如何在CTIActiveX中获取对客户端站点(浏览器窗口)的引用?我通过实现IObjectWithSite在BHO中完成了这个,但我不认为这是ActiveX控件的正确方法.如果我尝试在Javascript中实例化时在CTIActiveX上实现任何接口(我的意思是像IObjectWithSite这样的COM接口),我会收到一个错误,该对象不支持自动化.

jle*_*lew 4

首先,您的界面需要 ComVisible(true) 才能被调用脚本看到(这可能导致错误)。

其次,将项目中的 .NET 引用添加到“Microsoft.mshtml”。这将导入各种与 IE 相关的事物(窗口、HTML 文档等)的 COM 接口

然后,您需要将 IHtmlDocument2 类型的属性添加到您的界面:

IHtmlDocument2 Document { set; }
Run Code Online (Sandbox Code Playgroud)

...在你的班级中实现它:

public IHtmlDocument2 Document
{
  set { _doc = value;}
}
Run Code Online (Sandbox Code Playgroud)

...从脚本中调用它

CTIAX.Document = document; 
Run Code Online (Sandbox Code Playgroud)

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