Я использую ATL (VS2008, таким образом, ATL9 IIRC) для создания COM-объектов, и использовали CComVariant
класс (определенный в atlcomcli.h
) справиться VARIANT
типы. Однако существует также другой VARIANT
обертку называют _variant_t
. Есть ли любое различие между CComVariant
и _variant_t
и какой я должен использовать?
Точно так же существуют два BSTR
доступные обертки - CComBSTR
и _bstr_t
. Снова, который я должен предпочесть и почему?
_variant_t и _bstr_t предоставляются компилятором как классы поддержки COM и используются при использовании таких конструкций, как #import. Вы можете использовать их, если хотите.
CComVariant и CComBSTR предоставляются библиотеками ATL .
Используете ли вы классы поддержки COM или классы ATL - решать вам. Если вам часто нужно выполнять такие операции, как присоединение к «необработанным» BSTR или VARIANT, классы поддержки COM могут быть более безопасным вариантом.
Есть некоторые различия в поведении (см. Документацию), наиболее важным из которых, по-видимому, является то, что классы поддержки COM будут генерировать исключение _com_error &, когда что-то не удается. Если вы не хотите заниматься обработкой исключений, используйте классы ATL.
BSTR и VARIANT - это типы данных, которые заключены в классы CComBSTR / _bstr_t и CComVariant / _variant_t.
Итак, как указано ранее, классы предоставляют больше методов и т. Д.
Одно из основных отличий состоит в том, что классы ATL не генерируют исключения, а классы поддержки компилятора делают это (особенно _com_exception
).
_bstr_t
подсчитывается по ссылкам, а CComBSTR
больше похожа на необработанную оболочку.
Я использую оба в зависимости от поставленной задачи. Как уже говорилось, _variant_t и _bstr_t являются более базовыми, в то время как классы ATL являются более высокоуровневыми (более приятный аналог MFC). Мой совет - посмотреть немного на определения классов. Все они являются лишь помощниками для создания более компактного и читабельного кода, но все же содержат определенные подводные камни в отношении управления памятью и объектными ссылками. Поэтому нужно знать немного об их внутреннем устройстве, а документация часто не очень понятна.