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
. Опять же, что я должен предпочесть и почему?
Ответы
Ответ 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.
Так, как указано выше, классы предоставляют больше методов и т.д.