Перевод из BSTR в wchar_t
int s = (int)wcslen(a);
wchar_t *b = new wchar_t;
можно еще и stl::wstring использовать
int s = (int)wcslen(a);
wchar_t *b = new wchar_t;
можно еще и stl::wstring использовать
Во-первых, этот код не переведет BSTR в wchar_t, а просто создаст строку требуемой длины. Пустую.
Во-вторых - цитата из MSDN:
The following code is incorrect:
:)
BSTR в зависимости от платформы (32 или 16 бит) является либо Unicode, либо Ansi строкой. Поэтому в случае 32 бит можно просто скастовать BSTR к wchar_t* (только для чтения), в случае 16 бит - использовать функции MultiByteToWideChar, WideCharToMultiByte.
Лучше непосредстенно не модифицировать содержимое памяти, на которое указывает BSTR, а создать у себя копию, поработать с ней, а после воспользоваться SysReAllocString для записи содержимого.
согласен, поторопился, забыл копирование дописать :)
:)
BSTR в зависимости от платформы (32 или 16 бит) является либо Unicode, либо Ansi строкой. Поэтому в случае 32 бит можно просто скастовать BSTR к wchar_t* (только для чтения), в случае 16 бит - использовать функции MultiByteToWideChar, WideCharToMultiByte.
Лучше непосредстенно не модифицировать содержимое памяти, на которое указывает BSTR, а создать у себя копию, поработать с ней, а после воспользоваться SysReAllocString для записи содержимого.
typedef WCHAR OLECHAR;
typedef /* [wire_marshal] */ OLECHAR *BSTR;
как видно BSTR == wchar_t*
wchat_t s = (wchar_t*)text[0];
Эт я типа безграмотный?
Кроме того, я читал структуру BSTR. Первые 4 байта - длинна строки. Дальше текст, заканчивающийся двойным ноль-символом. Переведётся ли такой формат нормально путём приведения типов?
:)
typedef WCHAR OLECHAR;
typedef /* [wire_marshal] */ OLECHAR *BSTR;
как видно BSTR == wchar_t*
Еще раз, читаем ОЧЕНЬ внимательно:
typedef WCHAR OLECHAR;
...
#else
typedef char OLECHAR;
...
Т.к. автор пользует QT, то вопросы переносимости кода для него, наверное, не вторичны (хотя 5й пост это, скорее, опровергает).
[quote=PanCotzky]
Насколько я понял, не совсем так. По крайней мере, нормально у меня не получилось перевести BSTR в wchar_t простым приведением типов. Мож, конечно, я что-то не правильно сделал.
Код:
BSTR text;
wchat_t s = (wchar_t*)text[0];
Эт я типа безграмотный?
[/quote]
Типа того.
Кстати, длина строки размещена до места, на которое указывает BSTR (т.е. BSTR указывает внутрь аллокированной области, а не в её начало). Поэтому и нельзя использовать конструкции вида BSTR string = L"sss"; - байты с длиной строки остаются неинициализированными (иногда и не аллокированными).
Поясните.
Мне нужно перевести в любой стандартный тип: char, wchar_t, uchar. Кьютовская строка не берёт микрософтовские форматы, а мне нужен текст, возвращаемый одной из компонент виндовс СКДшной библиотеки. Примерно так. Пардон, если ламер. Визуалом и мелкомягкой продукцией в принципе пользуюсь, наверное, впервые.
Поясните.
Мне нужно перевести в любой стандартный тип: char, wchar_t, uchar. Кьютовская строка не берёт микрософтовские форматы, а мне нужен текст, возвращаемый одной из компонент виндовс СКДшной библиотеки. Примерно так. Пардон, если ламер. Визуалом и мелкомягкой продукцией в принципе пользуюсь, наверное, впервые.
Это я вчера уставший был, код не так прочтал :o. Прошу прощения.