CComVariant против _variant_t, CComBSTR против _bstr_t - PullRequest
17 голосов
/ 18 февраля 2010

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

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

Ответы [ 4 ]

16 голосов
/ 18 февраля 2010

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

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

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

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

7 голосов
/ 18 февраля 2010

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

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

1 голос
/ 18 февраля 2010

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

0 голосов
/ 18 февраля 2010

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

...