【问题标题】:Implementing a bare-bones COM object实现一个简单的 COM 对象
【发布时间】:2010-11-17 10:31:47
【问题描述】:

我需要在传统的 Web 应用程序使用的直接 C++(无 ATL)中实现一个准系统 COM 对象,以检查我的应用程序是否存在。 Web 应用程序执行以下操作(JavaScript):

var object = new ActiveXObject("My.Application");

我想确保上述操作成功,但这就是我需要做的全部 - 我不需要在此对象上实现任何方法/属性,因为它们从未被调用过。

显然我需要通过添加必要的注册表设置等来确保我的对象已注册。我的应用程序是一个 DLL,所以我想我还需要实现一些导出的函数(DllRegisterServer、DllUnregisterServer、DllCanUnloadNow 和一个那必须是这样的东西,DllGetClassObject)。

我很确定,简单地从 DllGetClassObject 返回 S_OK 不会解决问题。

如何在不使用 ATL 的情况下实现基本接口?如果有帮助,我正在使用 MS 编译器。

【问题讨论】:

  • 你为什么不想要 ATL?
  • 这是我被告知不要使用的依赖项。恐怕我会失手。
  • 这太简单了。您可以静态链接到 ATL,因此您不需要随身携带 ATL.dll - 甚至没有人会看到它并且它将为您节省大量时间和错误。最好的办法是协商 ATL 的使用。

标签: c++ com


【解决方案1】:

仅仅构建一个简单的 COM 对象是不够的。对于初学者来说,这太简单了,以至于没有与之相关的名称。你已经发现你也需要一个对象工厂。

所以,是的,实现DllGetClassObject。您必须检查输入 rclsid 参数。这是一个接口标识符。如果您不认识它,请返回CLASS_E_CLASSNOTAVAILABLE。显然,由于骇客的方法(例如您建议的无条件 S_OK)Microsoft now passes at least one invalid class ID.。如果您撒谎并声称您可以做到,Windows 不会相信您说的任何其他内容。

那么,您应该声明哪些接口?显然IUnknown - 它是系统的根本。最简单的 COM 对象不做任何其他事情。不过,您需要更多接口 - Web 应用程序要求一个 ActiveX 对象。这需要更多的接口。可能最简单的方法就是查看 Windows 的要求。我怀疑你至少需要 IDispatch。

接下来,您必须实现一些方法。 “等等”,你可能会说,“他们没有被召唤”。好吧,IDispatch 是一种用于脚本语言的元接口。它用于枚举可用的方法。因此,您的IDispatch 接口也应该支持这样的枚举,即使它会返回零个可编写脚本的方法。

还有更多细节,但这应该足以帮助说服您使用 ATL 并获取其 ActiveX 代码。这将比我在这里列出的任何内容都要完整。

【讨论】:

  • 感谢您的帮助。我实现了一个简单的对象和工厂,它运行良好。
【解决方案2】:

没有关于支持从 IE 中运行的 Javascript 进行后期绑定的 COM 服务器的基本信息。如果你不知道如何实现 DllGetClassObject() 那么你需要你能得到的所有帮助。您可以从 ATL 和 Visual Studio 中内置的向导获得很多帮助。绝大多数丑陋的管道代码都是自动生成的,包括这 4 个导出。还有IDispatch,Javascript需要的接口。

使用 ATL + ATL 项目模板启动项目。默认值很好。右键单击项目、添加、类并选择 ATL + ATL 简单对象。切换到类视图,找到您的接口类型并右键单击它以添加方法和属性。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多