2010-02-18 10 views
17

Sto usando ATL (VS2008, quindi ATL9 IIRC) per creare oggetti COM e sono state usando la classe CComVariant (definito in atlcomcli.h) per gestire VARIANT tipi. Tuttavia, esiste anche un altro wrapper VARIANT chiamato _variant_t. C'è qualche differenza tra CComVariant e _variant_t e quale dovrei usare?CComVariant vs _variant_t, CComBSTR vs. _bstr_t

Analogamente, sono disponibili due wrapper BSTR - CComBSTR e _bstr_t. Ancora una volta, quale dovrei preferire e perché?

risposta

15

_variant_t e _bstr_t sono forniti dal compilatore come COM support classes e vengono utilizzati quando si utilizzano costrutti come #import. Puoi usarli se vuoi.

CComVariant e CComBSTR sono forniti da ATL libraries.

Indipendentemente dal fatto che si utilizzino le classi di supporto COM o le classi ATL. Se devi spesso eseguire operazioni come allegare a BSTR "grezzi" o VARIANT, le classi di supporto COM potrebbero essere una scommessa più sicura.

Esistono alcune differenze comportamentali (controllare i documenti), la più importante delle quali sembra essere che le classi di supporto COM generino un'eccezione _com_error & quando qualcosa non va a buon fine. Se non si desidera eseguire la gestione delle eccezioni, andare con le classi ATL.

+0

Nota che _variant_t e _bstr_t sono forniti gratuitamente nell'SDK. ATL è fornito con MSDN ed è a pagamento. – Ben

+0

+1 per le informazioni sugli allegati. Puoi incapsulare un 'BSTR bstr' esistente come' _bstr_t my_bstr (bstr, false) 'o' CComBSTR my_bstr; my_bstr.Attach (bstr); 'quindi se hai solo bisogno della distruzione automatica di BSTR,' _bstr_t' è più semplice. –

0

BSTR e VARIANT sono tipi di dati racchiusi tra CComBSTR/_bstr_t e le classi CComVariant/_variant_t.
Quindi, come detto prima le classi fornire più metodi ecc

7

Una differenza importante è che le classi di ATL non gettare eccezioni, e le classi di supporto del compilatore do (_com_exception, in particolare).

_bstr_t conteggio di riferimento mentre CComBSTR è più di un wrapper raw.

+2

+1 Direi che questa è la differenza chiave. Con ATL devi scrivere un sacco di codice di controllo degli errori extra. D'altra parte, se non vuoi preoccuparti delle eccezioni, dovresti preferire le classi ATL. – sharptooth

1

Uso entrambi in base all'attività in corso. Come detto prima _variant_t e _bstr_t sono più semplici mentre le classi ATL sono più di alto livello (la controparte più bella di MFC). Il mio consiglio è di guardare un po 'le definizioni delle classi. Tutti sono solo aiutanti per un codice più piccolo, meglio leggibile, ma contengono comunque alcune insidie ​​riguardo alla gestione della memoria e dei riferimenti agli oggetti. Quindi devi conoscere un po 'dei loro interni e la documentazione spesso non è molto chiara a riguardo.

+0

+1 Questo è davvero il caso quando passare un'ora a leggere la fonte ti dà una comprensione molto migliore. – sharptooth

Problemi correlati