C++ 初始化com组件时使用构造函数

C++ 初始化com组件时使用构造函数,c++,com,C++,Com,我将尽可能简单地描述这个问题 好了,问题来了 假设我们有一个com组件类,其中有3个构造函数,其中一个构造函数至少有两个参数。我们已经知道,我们通过QueryInterface实例化组件,而不是调用类的构造函数,因此com客户端似乎不可能设置构造函数的参数 好了,问题来了 允许com客户端实例化至少需要初始化两个参数的com组件的最佳实用方法是什么?如果它是纯com组件,处理它的标准方法是实现初始化(foo,bar)方法而不是单独的构造函数,然后在COM实例化后立即调用。如果对象没有可感知的默认

我将尽可能简单地描述这个问题

好了,问题来了

假设我们有一个com组件类,其中有3个构造函数,其中一个构造函数至少有两个参数。我们已经知道,我们通过QueryInterface实例化组件,而不是调用类的构造函数,因此com客户端似乎不可能设置构造函数的参数

好了,问题来了


允许com客户端实例化至少需要初始化两个参数的com组件的最佳实用方法是什么?

如果它是纯com组件,处理它的标准方法是实现初始化(foo,bar)方法而不是单独的构造函数,然后在COM实例化后立即调用。如果对象没有可感知的默认状态,则可以将其设置为COM对象中的成员变量(指针)。从该COM对象,您将拥有初始化(foo,bar)函数。在每个初始化函数中,对象的正确版本都将被实例化。COM包装中的每个传递函数都需要检查对象是否为NULL,如果为NULL,则返回相应的HRESULT。

一个选项是使用factory对象;创建函数将全部在(无状态)工厂对象上(当然是在不同的接口上),并传回实际对象的初始化实例。

您的
QueryInterface
调用可以返回工厂,而不是直接返回对象实例。例如,而不是:

// implements IMyClass1 interface
return new MyClass1();
你会做:

// pointer to member that implements IMyClassFactory interface
return &m_myClassFactory;
// this could also be a static class instead of an object instance
IMyClassFactory
接口将有一个
create
方法,该方法接受构造函数参数并返回最终的
MyClass1
实例。

我喜欢这两个答案,并且对这两个都进行了投票。通常情况下,我会把它留在那里,但我觉得这次我必须详细说明我的全部想法

做到这一点的“最好的”、“正确的”、“最纯粹的”、“规范的”方式无疑是Ates所描述的工厂模式。如果你想创建一个干净的API,这就是道路,放手去做


但是。。。我们大多数人并不忙于为商业产品创建公共API。对于具有非公共API的小型内部项目,我只想完成这项工作。必须实现一个额外的对象才能公开一个工厂方法,这听起来有点过分(特别是在C++中)。在大多数实际情况下,我会选择Steve描述的
初始化(foo,bar)
方法。然后,我会确保每个非平凡的方法都会检查对象是否已初始化,如果未初始化,则返回失败的HRESULT。

当我编写COM服务器时,我通常不允许通过
CoCreateInstance
实例化我的组件。相反,我从DLL中导出一些裸函数(这些函数可以在IDL中描述,也可以在模块中描述),这些函数接受构造函数参数并在输出参数中返回指向新创建对象的接口指针。

。如何通过DCOM/COM+使用此类COM组件?@sharptooth:此类组件可以在进程中使用,这在许多应用程序中都很有用,但决不是所有应用程序都有用。我不确定midl是否可以为模块成员生成代理,我从不需要它。我基本上只是使用COM作为一种友好的方式,让RAD代码(例如经典VB)访问高性能的本机函数,以及过程中的高性能需求。我明白了。MIDL将仅为IDL文件中的接口生成代理,并且您将无法启动outproc服务器(直接或作为COM+代理)并保留这些输入函数中的任何一个-COM子系统必须自己执行此操作。所以这行不通。实现这一点的唯一方法是创建一个类工厂,该工厂可以通过
CoCreateInstance()
创建。