2010-11-17 82 views
2

我需要在直接C++(无ATL)中实现一个由传统Web应用程序用来检查我的应用程序是否存在的基本COM对象。 Web应用程序做这样的事情(JavaScript的):实现一个简单的COM对象

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

我要确保上述成功,但多数民众赞成所有我需要做的 - 我不需要实现这个对象上的任何方法/属性他们从未被调用过。

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

我敢肯定,简单地从DllGetClassObject返回S_OK不会削减它。

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

+2

你为什么不想要ATL? – sharptooth 2010-11-17 11:15:53

+0

这是我被告知不使用的依赖项。我害怕我的手。 – Rob 2010-11-17 16:19:46

+0

这是简单的。你可以静态链接到ATL,所以你不需要携带ATL.dll - 甚至没有人会看到它和**它会为你节省大量的时间和错误。你最好的就是谈判ATL的使用。 – sharptooth 2010-11-18 06:35:44

回答

3

建立一个基本的COM对象是不够的。对于初学者来说,这将是如此的秃头以至于没有与之相关的名字。你已经发现你也需要一个对象工厂。

所以,是的,实施DllGetClassObject。您必须检查输入rclsid参数。这是一个接口标识符。如果您不认识,请返回CLASS_E_CLASSNOTAVAILABLE。显然,由于骇人听闻的方式(如你建议的无条件S_OK)Microsoft now passes at least one invalid class ID.。如果你说谎,并声称你能做到,Windows就不会相信你说的其他东西。

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

接下来,您将不得不实施一些方法。 “等等”,你可能会说,“他们不叫”。那么,IDispatch是一种用于脚本语言的元接口。它用于枚举哪些方法可用。因此,即使它将返回零脚本化的方法,接口也应该支持这种枚举。

还有更多的细节,但这应该已经足以说服你使用ATL并获取它的ActiveX代码。这要比我在这里列出的任何东西都要完整得多。

+0

感谢您的帮助。我实现了一个简单的对象和工厂,它完美的工作。 – Rob 2010-11-18 09:12:37

1

还有什么都没有关于一个COM服务器的基础知识,它支持在IE内运行的Javascript的后期绑定。如果你不知道如何实现DllGetClassObject(),那么你需要所有的帮助。 ATL和内置于Visual Studio的向导可以为您提供很多帮助。绝大多数富有的管道代码都是自动生成的,包括那4个输出。还有IDispatch,Javascript需要的接口。

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