我承认自己对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控件的正确方法。如果我在CTIActiveX上实现任何接口(我的意思是COM接口,比如IObjectWithSite),当我尝试在Javascript中实例化时,会出现对象不支持自动化的错误。