1

我需要创建一个可从 Javascript 调用的 COM 对象。有人告诉我,要做到这一点,您需要一个还实现类工厂的 COM 对象,这里建议我尝试 ATL。有人向我指出了一个 Code Project ATL 示例,但是它不包括类工厂。

我可以用一个简单的对象构建一个小型 ATL 项目,但无法实例化它,这可能是因为我没有提供类工厂。

那么,有没有人有通过 ATL 在 VS2010 中构建一个可以从 Javascript 调用的简单 COM 对象的经验?

编辑:好吧,在阅读 DECLARE_CLASSFACTORY_EX 的文档时,这听起来像是提供了一个默认的类工厂。所以现在我不确定缺少什么。从 Javascript 实例化和调用类需要什么?

编辑:另外,澄清一下,我从中调用对象的 Javascript 位于 HTML 页面中,该页面显示在 MFC 对话框应用程序的 IE ActiveX 控件中。这就是 Javascript 将在其中运行的上下文。

4

2 回答 2

4

首先,我相信您指的是用于 Internet Explorer 的 MS 专用 JScript,因为其他浏览器可能不支持 COM/ActiveX。

您不必显式地实现类工厂,因为 ATL 框架已经提供了它。只需运行 ATL 向导:查看 --> 类视图;在类视图中右键单击项目根 --> 添加 --> 类 --> ATL 简单对象;设置类名,其余的保留默认值。该向导将定义以下主要内容:

  1. 在 IDL 文件中实现它的接口和协同类。
  2. C++ 类,这将是上述 co-class 的实际实现。注意OBJECT_ENTRY_AUTO头文件中的宏:它在您的类和 ATL 框架类工厂之间“连接”。
  3. *.rgs 文件,用于在 Windows 注册表中注册您的 co-class。

现在您可以向这个新创建的类添加一些方法 - 通过向导(右键单击类 --> 添加 --> 添加函数...),或手动添加。

此外,为了避免组件的安全问题,您必须IObjectSafety在您的类中实现:只需从 继承 c++ 类 public IObjectSafetyImpl<CYourClass, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,并添加COM_INTERFACE_ENTRY(IObjectSafety)到接口映射。

现在您的类已准备好在 JScript 中使用。在脚本中,您可以使用object标记静态创建它,也可以使用new ActiveX()语句动态创建它。如果您的对象具有连接点(即触发事件)并且您不想太棘手,则必须使用前一种方法。

于 2012-11-07T14:42:55.590 回答
1

我早些时候发布了示例代码项目以回答另一个问题:将 COM 事件暴露给 VBScript (ATL)。它使用 VBS,我认为 JS 转换是一件容易的事情。

代码:SVN浏览器友好

另一个相关示例:SVNBrowser Friendly + 博客文章解释正在发生的事情:从 C++/ATL 类实现 VBScript(VB6、VBA)回调的三种方法

于 2012-11-09T01:20:36.157 回答