我正在学习 C++,我试图更好地理解它。我正在阅读有关如何使用 XmlLite 的 MSDN 文档。它说我必须使用一个实现
IStream
接口的类。它说声明并实例化我的扩展 IStream
的类,并在声明变量时使用 CComPtr
。然后它向我展示了以下内容:
CComPtr<IStream> pFileStream;
CComPtr<IXmlReader> pReader;
我有点困惑。如果使用
CComPtr
来拉取 XML,为什么我必须扩展 <IStream>
?为什么不直接让 CComPtr
实现 IStream
并直接调用 CComPtr
呢?或者 CComPtr
已经有了 IStream
并且 IStream
有效的唯一方法就是像上面那样扩展?
如果使用 CComptr 来拉取 xml。为什么我必须延长.为什么不让 CComptr 已经实现 IStream 并调用 CComptr 呢?
IStream 是一个接口——说“我想要一些实现这个接口的类”并不能告诉你想要如何实际获取数据。 CComPtr 只是一个指向实现接口的组件类的指针——它本身并不实际实现任何接口。
是否可以在不创建自定义接口的情况下实现COM接口?
我对此并不是 100% 肯定,但我不认为您需要实现一个界面。然而,您确实需要在组件类中实现接口本身。
CComPtr<>
是一个智能指针,用于自动管理对象的生命周期。它或多或少与 Interface*
相同,其中 Interface
是 CComPtr<> 模板参数(本例中为 IStream*
或 IXmlReader*
),但提供了一些不影响对象指向方式的附加功能发挥作用。
因此
CComPtr<IStream>
内部有一个 IStream*
和一个重载的 operator ->()
,它将呼叫重定向到该 IStream*
。这同样适用于 CComPtr<IXmlReader>
- 它里面有 IXmlReader*
。
这个问题需要一个复杂的答案。
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