2010-02-25 74 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

相關問題