2010-02-25 48 views
1

我正在学习C++,我正试图更好地理解它。我正在阅读关于如何使用xml lite的msdn文档。它说我必须使用实现IStream接口的类。它说声明和实例化我的类,它扩展了Istream,并在声明变量时使用CComPtr。那么它向我展示了以下内容。是否可以在不创建自定义接口的情况下实现COM接口?

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

我有点困惑。如果使用CComptr来拉取xml。为什么我必须延长。为什么不只是让CComptr已经实现了IStream并且只是调用了CComptr。或者CComptr已经有了IStream,istream的唯一有效方法就是像上面那样扩展?

回答

1

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

是否有可能实现COM接口而不创建自定义接口?
我在这里并不是100%肯定的,但我不相信你需要实现一个接口。然而,你需要在coclass中实现接口本身。

+0

你说得对。事实上这很常见。例如,所有Shell扩展通过Explorer.exe实现COM接口useb。很少添加自定义界面;资源管理器不会使用它们,因此它们仅供内部使用。 – MSalters 2010-02-25 14:10:34

+0

好吧,我用于语言,如果一个类实现一个接口。你可以打电话给班级。你不必上课。我的印象是,在C++中,为了让编译器注意到接口,你必须将它称为类。纠正我,如果我错了。 – numerical25 2010-02-25 14:49:16

+1

@numer25这不是C++语言的问题。这是COM的。 COM不是C++的一部分。这是二进制级别的Microsoft惯例。你也可以在C中实现COM对象。 http://en.wikipedia.org/wiki/Component_Object_Model – sergiom 2010-02-25 16:08:56

1

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

所以CComPtr<IStream>有一个IStream*里面和一个超载operator ->()重定向调用IStream*。同样适用于CComPtr<IXmlReader> - 它内部有IXmlReader*

-1

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

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

每个COM接口从IUnknown接口,实现的QueryInterface继承()的AddRef()和释放()方法

的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

相关问题