是否可以在不创建自定义接口的情况下实现COM接口?

问题描述 投票:0回答:3

我正在学习 C++,我试图更好地理解它。我正在阅读有关如何使用 XmlLite 的 MSDN 文档。它说我必须使用一个实现

IStream
接口的类。它说声明并实例化我的扩展
IStream
的类,并在声明变量时使用
CComPtr
。然后它向我展示了以下内容:

CComPtr<IStream> pFileStream;
CComPtr<IXmlReader> pReader;

我有点困惑。如果使用

CComPtr
来拉取 XML,为什么我必须扩展
<IStream>
?为什么不直接让
CComPtr
实现
IStream
并直接调用
CComPtr
呢?或者
CComPtr
已经有了
IStream
并且
IStream
有效的唯一方法就是像上面那样扩展?

c++ visual-c++ com
3个回答
1
投票

如果使用 CComptr 来拉取 xml。为什么我必须延长.为什么不让 CComptr 已经实现 IStream 并调用 CComptr 呢?
IStream 是一个接口——说“我想要一些实现这个接口的类”并不能告诉你想要如何实际获取数据。 CComPtr 只是一个指向实现接口的组件类的指针——它本身并不实际实现任何接口。

是否可以在不创建自定义接口的情况下实现COM接口?
我对此并不是 100% 肯定,但我不认为您需要实现一个界面。然而,您确实需要在组件类中实现接口本身。


1
投票

CComPtr<>
是一个智能指针,用于自动管理对象的生命周期。它或多或少与
Interface*
相同,其中
Interface
是 CComPtr<> 模板参数(本例中为
IStream*
IXmlReader*
),但提供了一些不影响对象指向方式的附加功能发挥作用。

因此

CComPtr<IStream>
内部有一个
IStream*
和一个重载的
operator ->()
,它将呼叫重定向到该
IStream*
。这同样适用于
CComPtr<IXmlReader>
- 它里面有
IXmlReader*


-1
投票

这个问题需要一个复杂的答案。

COM 接口不是 C++ 语言的一部分。它们可以使用不同的语言来实现。 C++只是其中之一。

每个COM接口都继承自IUnknown接口,它实现了QueryInterface()、AddRef()和Release()方法

必须使用QueryInterface()来请求COM对象接口。由于每个 COM 接口都继承自 IUnknown,因此可以在任何接口上调用它。

必须调用AddRef()和Release()来管理对象的生命周期。

CComPtr<> 是一个模板类,在 Microsoft ATL 库中实现,用于包装任何 COM 接口,在需要时自动调用 QueryInterface()、AddRef() 和 Release()。

在您的示例中,CComPtr pFileStream 可用于访问对象的 IStream 接口成员。

http://msdn.microsoft.com/en-us/library/ezzw7k98%28VS.80%29.aspx

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.