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