【问题标题】:How to create a C++ COM object (with class factory) using ATL and VS2010 callable from Javascript如何使用可从 Javascript 调用的 ATL 和 VS2010 创建 C++ COM 对象(带有类工厂)
【发布时间】:2012-10-26 00:08:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript visual-studio-2010 visual-c++ com atl


    【解决方案1】:

    首先,我相信您是指用于 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:只需从public IObjectSafetyImpl<CYourClass, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA> 继承c++ 类,并将COM_INTERFACE_ENTRY(IObjectSafety) 添加到接口映射。

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

    【讨论】:

    • 是的,这是在 HTML 页面中运行的 Javascript,它将在 IE 中呈现,特别是 IE ActiveX 控件。在这种情况下,不需要支持其他浏览器。这将是一个带有 IE 控件的 MFC 对话框,因此诀窍是能够在 Javascript 中执行操作,例如处理按钮单击并将其传递到对话框中的 C++ 代码,这意味着通过 ActiveX 对象。我会试试你的建议,看看我能不能让它发挥作用。
    • 对我来说,在 VS2008 中的步骤“现在您可以通过向导向这个新创建的类添加一些方法(右键单击类 --> 添加 --> 添加函数。 ..)”没有工作。方法已添加到类中,但未通过 COM 接口公开。起作用的是R-Click 新创建的界面-->添加-->添加方法。这为接口和类添加了方法。
    • @farfareast 是的,你是对的。但无论如何,在一个真正的项目中,在它增长一点之后,向导无法添加任何东西:)。
    • OBJECT_ENTRY_AUTO 让我不用再浪费一天时间去寻找其他地方,非常感谢!
    【解决方案2】:

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

    代码:SVN、Browser Friendly。

    另一个相关示例:SVN、Browser Friendly + 博文解释正在发生的事情:Three ways to implement VBScript (VB6, VBA) callback from C++/ATL class。

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2014-09-20
      • 1970-01-01
      • 2012-04-04
      • 2010-12-17
      • 2013-09-08
      相关资源
      最近更新 更多