Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перевод из BSTR в wchar_t

37K
08 декабря 2008 года
PanCotzky
15 / / 28.08.2008
Решаю глобальную задачу. Застопорился на сущей мелочовке, чтоб ей сгореть. Дело в том, что я - юзет Кьюта (Qt), а он маленько не поддерживает так обожаемый майкрософтовцами тип BSTR. Мне нужно найти способ перевести из типа BSTR в wchar_t. Желательно как можно быстрее. Из-за этого грёбаного типа работа стоит(
11
08 декабря 2008 года
oxotnik333
2.9K / / 03.08.2007
примерно так:
 
Код:
BSTR a = L"some string";
    int s = (int)wcslen(a);
    wchar_t *b = new wchar_t;

можно еще и stl::wstring использовать
562
09 декабря 2008 года
tarekon
175 / / 19.08.2003
Цитата: oxotnik333
примерно так:
 
Код:
BSTR a = L"some string";
    int s = (int)wcslen(a);
    wchar_t *b = new wchar_t;

можно еще и stl::wstring использовать


Во-первых, этот код не переведет BSTR в wchar_t, а просто создаст строку требуемой длины. Пустую.

Во-вторых - цитата из MSDN:

Цитата:

The following code is incorrect:
 
Код:
BSTR  MyBstr = L"I am a happy BSTR";


:)

BSTR в зависимости от платформы (32 или 16 бит) является либо Unicode, либо Ansi строкой. Поэтому в случае 32 бит можно просто скастовать BSTR к wchar_t* (только для чтения), в случае 16 бит - использовать функции MultiByteToWideChar, WideCharToMultiByte.

Лучше непосредстенно не модифицировать содержимое памяти, на которое указывает BSTR, а создать у себя копию, поработать с ней, а после воспользоваться SysReAllocString для записи содержимого.

11
09 декабря 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: tarekon
Во-первых, этот код не переведет BSTR в wchar_t, а просто создаст строку требуемой длины. Пустую.


согласен, поторопился, забыл копирование дописать :)

:)

Цитата: tarekon

BSTR в зависимости от платформы (32 или 16 бит) является либо Unicode, либо Ansi строкой. Поэтому в случае 32 бит можно просто скастовать BSTR к wchar_t* (только для чтения), в случае 16 бит - использовать функции MultiByteToWideChar, WideCharToMultiByte.

Лучше непосредстенно не модифицировать содержимое памяти, на которое указывает BSTR, а создать у себя копию, поработать с ней, а после воспользоваться SysReAllocString для записи содержимого.



 
Код:
typedef wchar_t WCHAR;
 typedef WCHAR OLECHAR;
 typedef /* [wire_marshal] */ OLECHAR *BSTR;

как видно BSTR == wchar_t*
37K
09 декабря 2008 года
PanCotzky
15 / / 28.08.2008
Насколько я понял, не совсем так. По крайней мере, нормально у меня не получилось перевести BSTR в wchar_t простым приведением типов. Мож, конечно, я что-то не правильно сделал.

 
Код:
BSTR text;
wchat_t s = (wchar_t*)text[0];


Эт я типа безграмотный?

Кроме того, я читал структуру BSTR. Первые 4 байта - длинна строки. Дальше текст, заканчивающийся двойным ноль-символом. Переведётся ли такой формат нормально путём приведения типов?
562
09 декабря 2008 года
tarekon
175 / / 19.08.2003
Цитата: oxotnik333
согласен, поторопился, забыл копирование дописать :)

:)

 
Код:
typedef wchar_t WCHAR;
 typedef WCHAR OLECHAR;
 typedef /* [wire_marshal] */ OLECHAR *BSTR;

как видно BSTR == wchar_t*



Еще раз, читаем ОЧЕНЬ внимательно:

 
Код:
#if defined(_WIN32) && !defined(OLE2ANSI)
typedef WCHAR OLECHAR;
...
#else
typedef char      OLECHAR;
...


Т.к. автор пользует QT, то вопросы переносимости кода для него, наверное, не вторичны (хотя 5й пост это, скорее, опровергает).

[quote=PanCotzky]
Насколько я понял, не совсем так. По крайней мере, нормально у меня не получилось перевести BSTR в wchar_t простым приведением типов. Мож, конечно, я что-то не правильно сделал.


Код:
BSTR text;
wchat_t s = (wchar_t*)text[0];
Эт я типа безграмотный?
[/quote]
Типа того.
 
Код:
wchar_t* s = (wchar_t*) text;


Кстати, длина строки размещена до места, на которое указывает BSTR (т.е. BSTR указывает внутрь аллокированной области, а не в её начало). Поэтому и нельзя использовать конструкции вида BSTR string = L"sss"; - байты с длиной строки остаются неинициализированными (иногда и не аллокированными).
562
09 декабря 2008 года
tarekon
175 / / 19.08.2003
Кстати, использовать типы CComBSTR или _bstr_t не получается? Не уверен, что они распространены среди разных компиляторов, но мало ли...
37K
09 декабря 2008 года
PanCotzky
15 / / 28.08.2008
Цитата:
(хотя 5й пост это, скорее, опровергает)



Поясните.

Мне нужно перевести в любой стандартный тип: char, wchar_t, uchar. Кьютовская строка не берёт микрософтовские форматы, а мне нужен текст, возвращаемый одной из компонент виндовс СКДшной библиотеки. Примерно так. Пардон, если ламер. Визуалом и мелкомягкой продукцией в принципе пользуюсь, наверное, впервые.

562
10 декабря 2008 года
tarekon
175 / / 19.08.2003
Цитата:

Поясните.

Мне нужно перевести в любой стандартный тип: char, wchar_t, uchar. Кьютовская строка не берёт микрософтовские форматы, а мне нужен текст, возвращаемый одной из компонент виндовс СКДшной библиотеки. Примерно так. Пардон, если ламер. Визуалом и мелкомягкой продукцией в принципе пользуюсь, наверное, впервые.


Это я вчера уставший был, код не так прочтал :o. Прошу прощения.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог