2012-05-23 5 views
1

При создании BSTR (с использованием _bstr_t в качестве класса-оболочки) я должен использовать некоторые из constructors of _bstr_t. Поскольку BSTR является строкой с префиксом длины, которая может содержать нулевые символы, должна быть возможность создать такую ​​строку, используя собственную строку, не полагаясь на нулевое завершение данной исходной строки.Как установить длину при создании BSTR (используя обертку _bstr_t) с помощью собственной строки?

Для примера:

wchar_t* pwNativeString = L"abc\0def\0\0ghi\0\0\0"; // + automatic "\0" 

// Now I want to create a BSTR using _bstr_t by this string. 
_bstr_t spBSTR = _bstr_t(pwNativeString); 

Проблема заключается в том, что конструктор опирается на нуль-прекращения pwNativeString. Таким образом, итоговый BSTR - это всего лишь "abc" и ничего более. Так что мой вопрос: Как создать BSTR или _bstr_t и доставить указатель на массив с определенной длиной? В следующем примере псевдокода:

_bstr_t spBSTR = _bstr_t(pwNativeString, 15); 

ответ

3

Использование SysAllocStringLen выделить BSTR, а затем использовать эти два-аргумента _bstr_t конструктор для создания объекта _bstr_t из него. Если вы установите второй параметр на true, тогда вам нужно будет позвонить по телефону SysFreeString. В противном случае объект _bstr_t владеет строкой и освободит ее для вас.

BSTR bstrIn = SysAllocStringLen(L"abc\0def\0\0ghi\0\0\0", 15); 
_bstr_t spBSTR(bstrIn, false); 
+0

Кстати, вы знаете, где хранится длина? Является ли он частью массива символов? Это структура или что это такое? –

+0

Кстати, для этого я буду использовать этот макрос, если он кому-то поможет: '#define _bstr_t_create (str, len) _bstr_t (SysAllocStringLen (str, len), false)' –

+0

Длина сохраняется в файле, определенного местоположением, определяемым ОС. Это обычно в четырех байтах, непосредственно предшествующих первому символу строки, но вместо того, чтобы предполагать, вы можете просто вызвать 'SysStringLen'. –

 Смежные вопросы

  • Нет связанных вопросов^_^