为什么COM类需要构造函数?如何在没有注册的情况下使用COM类?

时间:2012-04-06 15:17:04

标签: c++ com directshow

我正在研究Windows SDK中的DirectShow示例。许多类都具有非默认构造函数。如何调用这些构造函数?谁提供论据?

我可以在没有注册的情况下在C ++程序中使用这些类吗?如果是这样,我可以直接使用类构造函数。

如果我在没有注册的情况下使用COM类,则会在以下代码片段中发生以下情况:

Foo * foo = new Foo(.....); // note, not using CoCreateInstance
Bar * bar = foo->QueryInterface(...);
bar->Release();
delete foo; // CRASH?

谢谢!

2 个答案:

答案 0 :(得分:2)

它与COM无关,只是框架以这种方式构建,并且DirectShow BaseClasses中的构造函数参数是将所有内容组合在一起所必需的 - 类,祖先,实例化工厂。

使用COM类而不注册可能是也可能不可能。我怀疑你可能有兴趣在没有注册的情况下使用DirectShow过滤器,并且有一篇关于这个主题的好文章:Using Filters Without Registration

答案 1 :(得分:2)

作为真正的 COM coclass公开的C ++类通常不具有带参数的构造函数。 COM客户端代码没有机制将参数传递给CoCreateInstance()函数。 COM接口通常具有Initialize()方法以提供所需的初始化。技术上也可以修改,CoCreateInstance只是一个隐藏类工厂(IClassFactory)的便利功能。可以使用自定义类工厂和自定义CreateInstance()方法,但很少这样做。

Microsoft使用基于接口的编程模型,该模型在非COM代码中的COM代码中也很常见。 DirectX就是一个很好的例子。将Direct3DCreate9Ex()视为类工厂。