【问题标题】:How to work with COM object using JavaScript?如何使用 JavaScript 处理 COM 对象?
【发布时间】:2010-07-12 21:01:01
【问题描述】:

我解决了这个问题: 我使用 C# 创建 COM 对象,注册它并设法使用 powershell 使用它。 当我尝试对 JavaScript 做同样的事情时,它失败了,但是 javascript 不断抛出 object null 错误。

您对如何解决此问题有任何建议吗?或者你的 JavaScript 不支持 COM(如果支持,我在哪里可以阅读更多关于它的信息)???

非常感谢!

【问题讨论】:

  • 如果你的意思是 JScript,它是 MS 的 ECMAScript 方言,它支持 ActiveX 对象。
  • 但是 COM 对象(比如我创建的)不起作用?我使用 new ActiveXObject() 但它一直抛出对象 null。
  • 虽然 ActiveX 是基于 COM 构建的,但它还有一些额外的概念/要求。我不知道这在 C# 中是如何工作的,但是如果没有像其他人一样显示你的暴露对象的定义可能也对你没有帮助。
  • 您是否首先在 VBScript 中测试了 COM?通常 VBScript 是 COM 的事实上的(脚本语言)消费者/客户端,其他语言(JScript、Python 等)是次要的。从差异的角度来看,C/C++ 是另一个不错的选择,因为它不是脚本。如果它不能在 VBScript 或 C/C++ 中工作,它就不可能在 JScript 下工作。
  • 此外,使用 C# 或 Powershell 测试从 C# 创建的 COM 组件不是一个好主意,因为它们都在 .NET 框架内。您必须在此之外测试 COM 以确保 COM 互操作或无 reg 的 COM 正常工作。所以如果不是 JScript,最好先用 VBScript 或 C/C++ 进行测试。

标签: javascript com


【解决方案1】:

使用 Shanti Rao 的 JSDB shell。它基于 Firefox 中使用的核心 Spidermonkey 引擎(Mozilla 的 Javascript 实现),但有一堆用于数据库和 ActiveX 对象等的绑定。它有一些限制,但除非您使用复杂的东西,否则您应该能够使用它。

例子:

x=new ActiveX('MSXML2.DOMDocument.6.0');
x.async = false;
// I forget how to use IXMLDOMDocument but other calls go here

【讨论】:

  • 不应该是 new ActiveXObject() 而不是 ActiveX() 吗?
  • 好的,谢谢。有趣的是,这个解决方案/实现在实例化部分偏离了 JScript。我想类似于旧版本的 IE 在浏览器中普及和标准化之前不支持 XmlHttpRequest()。
  • JSDB 不是浏览器。 (坦率地说,JScript 不是 Javascript)
【解决方案2】:

Javascript 确实不支持 COM。一种选择是对 COM 对象使用 JScript 和 ActiveX 包装器。此外,它只能在 Internet Explorer 中运行。

Instantiating a COM class
Calling functions of a COM object in JScript
Other JScript/COM tutorials, including script callbacks

【讨论】:

  • 所以我从你的回答中看到了。谢谢你启发我。
  • 很难从 OP 关于使用细节的问题中看出,但 JScript COM/ActiveX 可用于 Windows 脚本主机 (WSH) 以及活动服务器页面 (ASP),但并不严格限于 Internet Explorer。课程浏览器特定的 JS 代码在 WSH 和 ASP 下无法运行。
【解决方案3】:

我知道这有点晚了,但是对于发现这个的其他人来说,是的,这很容易做到。这假设您在 Windows 上运行,因为您正在寻找 Windows/JavaScript 互操作性。

最重要的问题是“您使用的是什么 JavaScript 引擎?”因为这个功能是由那个引擎决定的。自 1995 年以来,Windows 一直支持最初称为 OLE 自动化或有时仅称为 COM 的系统标准脚本模型。基于 Windows 的脚本引擎,如内置于 Windows Scripting Host 中的 JavaScript 和 VBScript 引擎,除了 IE 到版本 8 和我认为最高到 11 之外,都使用此引擎。但是,IE 容器实施了安全限制,阻止了我的某些内容。我从工作中描述。像 node.js 这样的开源 JavaScript 引擎通常不使用 COM,因为这是 Windows 特定的功能,所以不能做我所描述的。

鉴于此,要完成您想要的,您必须: 1. 实现一个可编写脚本的 COM 对象。 2. 注册该对象(通常在构建过程中自动注册)。 3. 在 JavaScript 中,使用新的 ActiveX 对象创建该对象的实例,如上所述。

您可以使用 C# 和 C++ 编写对象。在这两种情况下,您都需要将对象基于 IDispatch。 C# 将使整个过程变得相当容易。本质上,您使用 guidgen 为您的界面和组件生成一些唯一的 GUID,然后使用 C# 中的一些 COM 特定属性来提供这些。这是一个很好的简单示例的链接(忽略事件的东西): https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/example-com-class

要知道的最重要的事情是,您将受限于可以将哪些数据类型作为参数或返回给调用者。字符串和整数之类的东西没有问题。对于其他人,您可以在 C# 中描述它们并将它们从 C# 发送到 JavaScript,但反过来就行不通了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多