Подтвердить что ты не робот

CComVariant vs. _variant_t, CComBSTR против _bstr_t

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

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

4b9b3361

Ответ 1

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

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

Будете ли вы использовать классы поддержки COM или классы ATL, зависит от вас. Если вам часто приходится выполнять операции, такие как привязка к "исходным" BSTR или VARIANT, классы поддержки COM могут быть более безопасными.

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

Ответ 2

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

_bstr_t подсчитывается по ссылке, тогда как CComBSTR является скорее сырой оболочкой.

Ответ 3

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

Ответ 4

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