实现一个简单的COM对象

时间:2010-11-17 10:31:47

标签: c++ com

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

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

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

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

我很确定从DllGetClassObject返回S_OK不会削减它。

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

2 个答案:

答案 0 :(得分:3)

构建一个简单的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代码。这比我在这里列出的任何内容都要完整得多。

答案 1 :(得分:1)

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

使用ATL + ATL项目模板启动项目。默认值很好。右键单击项目,Add,Class并选择ATL + ATL Simple Object。切换到“类视图”,找到您的界面类型,然后右键单击它以添加方法和属性。