实现裸体COM对象 我需要在直的C++(没有ATL)中实现一个BROM COM对象,它被遗留Web应用程序用来检查我的应用程序是否存在。web应用程序执行如下操作(JavaScript):

实现裸体COM对象 我需要在直的C++(没有ATL)中实现一个BROM COM对象,它被遗留Web应用程序用来检查我的应用程序是否存在。web应用程序执行如下操作(JavaScript):,c++,com,C++,Com,var object=newactivexobject(“My.Application”) 我想确保上述操作成功,但这就是我所需要做的——我不需要在这个对象上实现任何方法/属性,因为它们永远不会被调用 显然,我需要通过添加必要的注册表设置等来确保我的对象已注册。我的应用程序是一个DLL,因此我想我还需要实现一些导出的函数(DllRegisterServer、DllUnregisterServer、DllCanLoadNow以及必须这样做的函数DllGetClassObject) 我很确定,仅仅从

var object=newactivexobject(“My.Application”)

我想确保上述操作成功,但这就是我所需要做的——我不需要在这个对象上实现任何方法/属性,因为它们永远不会被调用

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

我很确定,仅仅从DllGetClassObject返回S_OK并不能解决这个问题


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

构建一个基本COM对象是不够的。首先,这将是如此赤裸裸,以至于没有名字与之关联。您已经发现还需要一个对象工厂

因此,是的,实现
DllGetClassObject
。您必须检查输入
rclsid
参数。这是一个接口标识符。如果无法识别,请返回
CLASS\u E\u CLASSNOTAVAILABLE
。显然,因为黑客的方法(比如你建议的无条件S_OK)。如果你撒谎,并声称你能做到,Windows不会相信你说的任何其他话

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

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

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

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


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

为什么不使用ATL?我被告知不要使用它。恐怕我没办法了,那太简单了。您可以静态链接到ATL,这样就不需要随身携带ATL.dll,甚至没有人会看到它,这将为您节省大量时间和bug。您最好是协商ATL的使用。谢谢您的帮助。我实现了一个简单的对象和工厂,它工作得非常好。