-2

我希望为 ActiveX 对象创建一个 Javascript 库,以实现可链接性。

例如,我正在寻找替换这个:

var dbEngine=new ActiveXObject('DAO.DBEngine.36');
var dbs=dbEngine.OpenDatabase('D:\\Todo.mdb');
var rs=dbs.OpenRecordset('SELECT * FROM ListItems');

像这样的东西(a la jQuery):

var rs=AX('DAO.DBEngine.36')
    .OpenDatabase('D:\\Todo.mdb')
    .OpenRecordset('SELECT * FROM ListItems');

我知道我可以这样做:

var rs=new ActiveXObject('DAO.DBEngine.36')
    .OpenDatabase('D:\\Todo.mdb')
    .OpenRecordset('SELECT * FROM ListItems');

但我无法从 Recordset 对象访问 Database 对象。

为此,AX 函数应在内部创建 DBEngine 对象并检查其成员/属性,然后在返回的对象上公开相应的方法。

如果成员/属性返回一个对象,则该对象本身将在 AX 函数中返回。

4

1 回答 1

1

只能在运行时检查实现 IDispatchEx 的对象。MSDN 专门列出了 IDispatch 和IDispatchEx之间的区别:

IDispatchEx 的开发旨在提供 IDispatch 的所有服务以及一些适用于更动态的后期绑定语言(如脚本语言)的扩展。除了 IDispatch 提供的功能之外,IDispatchEx 的其他功能包括:

向对象添加新成员(“expando”)。

删除对象的成员。

区分大小写的调度操作。

搜索具有隐式名称的成员。

枚举对象的 DISPID

从 DISPID 映射到元素名称。

获取对象成员的属性。

使用此指针的方法调用。

允许支持名称空间概念的浏览器获取对象的名称空间父级。

我已经大胆地提出了相关问题。

正如 Eric 在评论中指出的那样,您可以使用 foreach (或 for...in 也许?)来枚举对象的成员,但我不确定,从问题来看,您具体想要做什么。

由于并非所有 ActiveX 控件都会实现 IDispatchEx(或者可能不会正确或完全实现 IDispatchEx 的所有方法),是否有您想要使用的特定控件?

更多细节将导致更好的答案。

于 2010-01-17T21:08:29.583 回答