2010-02-18 55 views
17

我正在使用ATL(VS2008,所以ATL9 IIRC)創建COM對象並一直使用CComVariant類(在atlcomcli.h中定義)來管理VARIANT類型。但是,另外還有一個名爲_variant_tVARIANT包裝。 CComVariant_variant_t之間有什麼區別,我應該使用哪一個?CComVariant與_variant_t,CComBSTR與_bstr_t

同樣,有兩個BSTR包裝 - CComBSTR_bstr_t。再次,我應該選擇哪一個,爲什麼?

回答

15

_variant_t和_bstr_t由編譯器提供爲COM support classes,並在您使用像#import這樣的結構時使用。如果你喜歡,你可以使用它們。

CComVariant和CComBSTR由ATL libraries提供。

無論您使用COM支持類還是ATL類都取決於您。如果您經常需要執行附加到「原始」BSTR或VARIANT的操作,COM支持類可能會更安全。

有一些行爲上的差異(檢查文檔),其中最重要的似乎是COM支持類會在出現故障時拋出異常_com_error &。如果您不想執行異常處理,請使用ATL類。

+0

請注意,_variant_t和_bstr_t在SDK中免費提供。 ATL隨MSDN提供並付費。 – Ben 2012-06-27 09:38:10

+0

+1附件信息。你可以像'_bstr_t my_bstr(bstr,false)'或'CComBSTR my_bstr'封裝現有的'BSTR bstr'; my_bstr.Attach(bstr);'如果你只需要自動BSTR銷燬,'_bstr_t'更簡單。 – 2014-03-04 20:03:34

0

BSTR和VARIANT是由CComBSTR/_bstr_t和CComVariant/_variant_t類包裝的數據類型。
因此,作爲說明以前的學生提供更多的方法等

7

一個主要區別是,ATL的類不拋出異常,而編譯器支持類做(_com_exception,特別是)。

_bstr_t是引用計數,而CComBSTR更像是一個原始包裝。

+2

+1我想說這是關鍵的區別。用ATL你必須編寫很多額外的錯誤檢查代碼。另一方面,如果你不想打擾異常,你應該更喜歡ATL課程。 – sharptooth 2010-02-18 13:48:19

1

我使用兩者取決於手頭的任務。 如前所述,_variant_t和_bstr_t更基本,而ATL類更高級別(MFC更好的對應)。 我的建議是看看類的定義。它們都只是幫助程序,用於更小,更易讀的代碼,但在管理內存和對象引用方面仍然存在一些缺陷。所以你必須瞭解一些關於它們的內部結構,文檔通常不是很清楚。

+0

+1閱讀源代碼時花費一個小時可以讓你更好地理解。 – sharptooth 2010-02-18 13:55:23