1

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

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

如果我使用未注册的 COM 类,则以下代码片段中会发生什么:

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

谢谢!

4

2 回答 2

2

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

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

于 2012-04-06T15:33:45.843 回答
2

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

使用 COM 类而不注册可能是可能的,也可能是不可能的。我怀疑您可能对使用 DirectShow filter without registration 感兴趣,并且有一篇关于该主题的好文章:Using Filters without Registration

于 2012-04-06T15:25:24.333 回答