Во-первых, вам, возможно, вообще ничего не нужно делать, если все, что вам нужно сделать, это прочитать содержимое. Тип BSTR уже является указателем на массив wchar_t с нулевым символом в конце. Фактически, если вы проверите заголовки, вы обнаружите, что BSTR по существу определяется как:
typedef BSTR wchar_t*;
Таким образом, компилятор не может различить их, даже если они имеют разную семантику.
Есть два важных предостережения.
BSTR должны быть неизменными. Вы никогда не должны изменять содержимое BSTR после его инициализации. Если вы «измените его», вам нужно создать новый, назначить новый указатель и освободить старый (если он у вас есть).
[ ОБНОВЛЕНИЕ : это не так; извиняюсь! Вы можете изменить BSTR на месте; Я очень редко нуждался в этом.]
BSTR могут содержать встроенные нулевые символы, тогда как традиционные строки C / C ++ - нет.
Если вы имеете достаточный контроль над источником BSTR и можете гарантировать, что BSTR не имеет встроенных NULL, вы можете читать из BSTR, как если бы это был wchar_t, и использовать обычные строковые методы (wcscpy, и т.д.) для доступа к нему. Если нет, ваша жизнь становится сложнее. Вам придется всегда манипулировать вашими данными как большим количеством BSTR, так и в виде динамически размещаемого массива wchar_t. Большинство функций, связанных со строками, не будут работать правильно.
Предположим, вы управляете своими данными или не беспокоитесь о NULL. Предположим также, что вам действительно нужно сделать копию, и вы не можете просто прочитать существующий BSTR напрямую. В этом случае вы можете сделать что-то вроде этого:
UINT length = SysStringLen(myBstr); // Ask COM for the size of the BSTR
wchar_t *myString = new wchar_t[lenght+1]; // Note: SysStringLen doesn't
// include the space needed for the NULL
wcscpy(myString, myBstr); // Or your favorite safer string function
// ...
delete myString; // Done
Если вы используете обертки классов для своего BSTR, у обертки должен быть способ вызова SysStringLen () для вас. Например:
CComBString use .Length();
_bstr_t use .length();
ОБНОВЛЕНИЕ : Это хорошая статья по этому вопросу, написанная кем-то гораздо более знающим, чем я:
«Полное руководство Эрика [Липперта] по семантике BSTR»
ОБНОВЛЕНИЕ : заменил strcpy () на wcscpy () в примере