我承认我对 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 接口),我会收到一个错误,即该对象不支持自动化。