visual tutorial template libreria library active c++ com atl

tutorial - libreria mfc de visual c++



CComVariant vs._variant_t, CComBSTR vs._bstr_t (4)

Estoy usando ATL (VS2008, ATL9 IIRC) para crear objetos COM y he estado usando la clase CComVariant (definida en atlcomcli.h ) para administrar los tipos VARIANT . Sin embargo, también hay otro envoltorio VARIANT llamado _variant_t . ¿Hay alguna diferencia entre CComVariant y _variant_t y cuál debería estar usando?

De manera similar, hay dos envoltorios BSTR disponibles: CComBSTR y _bstr_t . De nuevo, ¿cuál debería preferir y por qué?


BSTR y VARIANT son tipos de datos que están envueltos por las clases CComBSTR / _bstr_t y CComVariant / _variant_t.
Así que como se indicó antes las clases proporcionan más métodos, etc.


Una diferencia importante es que las clases de ATL no lanzan excepciones, y las clases de soporte del compilador sí lo hacen ( _com_exception , específicamente).

_bstr_t se cuenta como referencia, mientras que CComBSTR es más bien un contenedor en bruto.


Yo uso ambos dependiendo de la tarea en cuestión. Como se indicó antes, _variant_t y _bstr_t son más básicas, mientras que las clases ATL son más altas (la mejor contraparte de MFC). Mi consejo es mirar un poco las definiciones de las clases. Todos ellos son solo ayudantes de código más pequeño y mejor legible, pero aún contienen ciertas trampas en lo que respecta a la administración de memoria y referencias de objetos. Así que tienes que saber un poco sobre sus aspectos internos y la documentación a menudo no es muy clara al respecto.


_variant_t y _bstr_t son proporcionados por el compilador como clases de soporte de COM y se utilizan cuando se usan construcciones como #import. Puedes usarlos si quieres.

CComVariant y CComBSTR son proporcionados por las bibliotecas ATL .

Si utiliza las clases de soporte COM o las clases ATL, depende de usted. Si a menudo necesita realizar operaciones como adjuntar a BSTR ''sin procesar'' o VARIANT, las clases de soporte COM pueden ser una apuesta más segura.

Existen algunas diferencias de comportamiento (verifique los documentos), la más importante de las cuales parece ser que las clases de soporte COM producirán una _com_error y una excepción cuando algo falla. Si no quieres hacer un manejo de excepciones, ve con las clases de ATL.