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

问题描述:

我正在研究Windows SDK中的DirectShow示例。许多类都具有非默认构造函数。这些构造函数是如何被调用的?谁提供论据?为什么COM类需要构造函数?如何在不注册的情况下使用COM类?

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

如果我使用一个COM类未经登记什么下面的代码片段会发生:

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

谢谢!

+0

你不知道在一般情况下如何实现'Release'(它甚至可能是空操作,或者使用另一个内存分配器)。在这里,它很可能会做'删除这个'。你应该使用'CoCreateInstance' +'Release',这是唯一安全的事情。 – 2012-04-06 15:49:21

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

无需注册即可使用COM类可能是也可能不可能。我怀疑你可能有兴趣在不注册的情况下使用DirectShow过滤器,并且有关该主题的好文章:Using Filters Without Registration

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

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