c++ - 实现一个简单的 COM 对象

标签 c++ com

我需要用直接的 C++(无 ATL)实现一个简单的 COM 对象,遗留 Web 应用程序使用该对象来检查我的应用程序是否存在。 Web 应用程序执行类似以下操作 (JavaScript):

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

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

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

我很确定仅仅从 DllGetClassObject 返回 S_OK 不会解决问题。

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

最佳答案

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

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

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

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

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

关于c++ - 实现一个简单的 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203487/

相关文章:

c++ - 在函数实现中强制执行注释

c++ - 求解字符串中的等式以得到 C

c# - 当从 native win32 应用程序调用 C# COM 程序集时,如何调试它?

.net - 如何找到我的 .Net 应用程序在何处泄漏 Windows 句柄?

c++ - OSX Lion 上的 makefile 中的 GLFW 链接问题

c++ - 有没有办法用一行来初始化容器?

c++ - 是否有标准方法可以在编译时确定系统是 32 位还是 64 位?

c++ - 如何使用 CoCreateInstance() 获取 com 对象?

c# - 使用 .net remoting 调用本地 "remote"?

visual-studio - 是否有有关.rgs文件语法的文档?