CComVariant по сравнению с _variant_t, CComBSTR по сравнению с _bstr_t

Я использую ATL (VS2008, таким образом, ATL9 IIRC) для создания COM-объектов, и использовали CComVariant класс (определенный в atlcomcli.h) справиться VARIANT типы. Однако существует также другой VARIANT обертку называют _variant_t. Есть ли любое различие между CComVariant и _variant_t и какой я должен использовать?

Точно так же существуют два BSTR доступные обертки - CComBSTR и _bstr_t. Снова, который я должен предпочесть и почему?

18
задан Rob 18 February 2010 в 13:19
поделиться

4 ответа

_variant_t и _bstr_t предоставляются компилятором как классы поддержки COM и используются при использовании таких конструкций, как #import. Вы можете использовать их, если хотите.

CComVariant и CComBSTR предоставляются библиотеками ATL .

Используете ли вы классы поддержки COM или классы ATL - решать вам. Если вам часто нужно выполнять такие операции, как присоединение к «необработанным» BSTR или VARIANT, классы поддержки COM могут быть более безопасным вариантом.

Есть некоторые различия в поведении (см. Документацию), наиболее важным из которых, по-видимому, является то, что классы поддержки COM будут генерировать исключение _com_error &, когда что-то не удается. Если вы не хотите заниматься обработкой исключений, используйте классы ATL.

16
ответ дан 30 November 2019 в 08:38
поделиться

BSTR и VARIANT - это типы данных, которые заключены в классы CComBSTR / _bstr_t и CComVariant / _variant_t.
Итак, как указано ранее, классы предоставляют больше методов и т. Д.

{{1} }
0
ответ дан 30 November 2019 в 08:38
поделиться

Одно из основных отличий состоит в том, что классы ATL не генерируют исключения, а классы поддержки компилятора делают это (особенно _com_exception ).

_bstr_t подсчитывается по ссылкам, а CComBSTR больше похожа на необработанную оболочку.

7
ответ дан 30 November 2019 в 08:38
поделиться

Я использую оба в зависимости от поставленной задачи. Как уже говорилось, _variant_t и _bstr_t являются более базовыми, в то время как классы ATL являются более высокоуровневыми (более приятный аналог MFC). Мой совет - посмотреть немного на определения классов. Все они являются лишь помощниками для создания более компактного и читабельного кода, но все же содержат определенные подводные камни в отношении управления памятью и объектными ссылками. Поэтому нужно знать немного об их внутреннем устройстве, а документация часто не очень понятна.

1
ответ дан 30 November 2019 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: