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

Ваш аккаунт

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

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

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

Работа с BSTR

1.8K
01 мая 2008 года
Arkady
153 / / 18.12.2007
Здравствуйте,

Подскажите пожалуйста, вот есть код
 
Код:
wchar_t wc[4];
mbstowcs(wc, "alba", 4);
BSTR bwc = SysAllocString(wc);

Я создал массив wchar-ов длиною 4.
Положил в него слово "alba" длиною 4.
Создал переменную BSTR bwc, используя специальную для этого функцию, положив туда свою переменную alba.

Слово, которое лежит в bwc - "al", длиною 2.

Как такое может быть?
246
01 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Arkady
Здравствуйте,

Подскажите пожалуйста, вот есть код
 
Код:
wchar_t wc[4];
mbstowcs(wc, "alba", 4);
BSTR bwc = SysAllocString(wc);

Я создал массив wchar-ов длиною 4.
Положил в него слово "alba" длиною 4.
Создал переменную BSTR bwc, используя специальную для этого функцию, положив туда свою переменную alba.

Слово, которое лежит в bwc - "al", длиною 2.

Как такое может быть?



А в чем смысл твоих исследований? В Билдере рекомендуется использовать тип WideString.

ЗЫ: По моему в SysAllocString передается AnsiString, но это надо уточнить.

1.8K
01 мая 2008 года
Arkady
153 / / 18.12.2007
Просто COM-интерфейс должен использовать тип BSTR для передачи данных, чтобы быть совместимым с любым языком =( я бы с радостью что-то другое использовал, но привязан к этому.

А как заставить это работать так, чтобы я его понимал?
11
02 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
CComBSTR есть еще обертка для BSTR под COM
8.8K
02 мая 2008 года
Se AD WMD
165 / / 10.01.2007
Вот так:
 
Код:
wchar_t wc[4];
mbstowcs(wc, "alba", 5);
BSTR bwc = SysAllocString(wc);
Edit1->Text=bwc;

Работает нормально, именно с 5.
1.8K
03 мая 2008 года
Arkady
153 / / 18.12.2007
Спасибо!
Такой ещё вопрос по BSTR.

Вот у меня есть строка длинною в 80 символов. При этом разумных там 12, а оставшееся мусор, в том числе нулевые символы.
Как мне сделать BSTR, которое бы вобрало в себя целиком всю строчку на 80 и имело эту длину.

 
Код:
wchar_t* wStr;
    BSTR* Mem;

    wStr = (wchar_t*)malloc(80);
    mbstowcs(wStr, upinfo->orgname, 80);
    Mem = SysAllocString(wStr);


Ведь очевидно, что в Mem попадет только символы до первого нулевого! А надо, чтобы все =(
Среди функций для работы с BSTR я не нашел такую, которая бы это делала, если плохо искал - подскажите такую пожалуйста.

Кроме того, правильно ли я понимаю, что SysAllocString именно КОПИРУЕТ передаваемые в неё символы и создает BSTR, который дублирует строчку. И я могу удалить строку после этого free(wStr), а BSTR останется целой?

И правильно ли я понимаю, что функция SysReAllocString(&bstr1, Mem); так же копирует строку, и если я потом освобожу Mem, в переменной bstr1 всё равно будет нужная строка в целостности?
1.8K
04 мая 2008 года
Arkady
153 / / 18.12.2007
Что-то я вообще не могу найти функцию для этого, возникает вопрос - зачем тогда было делать BSTR именно такой, если главным её бонусом пользоваться можно только если руками в память лезть, судя по всему...
1.8K
08 мая 2008 года
Arkady
153 / / 18.12.2007
Помогите! =) Так и не нашел решение)
8.8K
09 мая 2008 года
Se AD WMD
165 / / 10.01.2007
Ну например вот так:
 
Код:
BSTR * test=new BSTR[81];//Объявляем переменную и выделяем под неё место
String a;//Объявляем переменную
a=AnsiString::StringOfChar('V',80);//Забиваем её строкой из 80 символов V
a.c_str()[45]=0x00;//46-й символ - NULL
for(int i=0;i<80;i+=1)
test=(wchar_t *)a.c_str();//Копируем из а в test

З.Ы. имхо гемор

З.З.Ы. А какая конкретно задача? Может и без BSTR её можно решить?
1.8K
09 мая 2008 года
Arkady
153 / / 18.12.2007
Цитата: Se AD WMD
Ну например вот так:
 
Код:
BSTR * test=new BSTR[81];//Объявляем переменную и выделяем под неё место
String a;//Объявляем переменную
a=AnsiString::StringOfChar('V',80);//Забиваем её строкой из 80 символов V
a.c_str()[45]=0x00;//46-й символ - NULL
for(int i=0;i<80;i+=1)
test=(wchar_t *)a.c_str();//Копируем из а в test

З.Ы. имхо гемор

З.З.Ы. А какая конкретно задача? Может и без BSTR её можно решить?



Спасибо...
Только разве так можно:

 
Код:
BSTR * test=new BSTR[81];
???
BSTR это же не тип, а скорее структура данных... такое объявление точно вернет указатель на нужное место?

Задача передать через COM-интерфейс структуру из чаров, суммарной длинною в 80 символов, но при этом имеющую кучу нулевых.
Передавать массив лениво, потому что там 36 слов (большая часть короткие), поэтому я хочу одной строкой =)
К тому же это не противоречит концепции системы, т.к. там эта структура тоже рассматривается строкой.
8.8K
09 мая 2008 года
Se AD WMD
165 / / 10.01.2007
Цитата: Arkady
Только разве так можно:
 
Код:
BSTR * test=new BSTR[81];
???
BSTR это же не тип, а скорее структура данных... такое объявление точно вернет указатель на нужное место?


Можна, BSTR фактически wchar_t, а оператор new заменяет тут SysAllocString - только SysAllocString сам объявляет нужный размер и копирует в BSTR строку
Если посмотреть на объявление то видем такое:

 
Код:
typedef /* [wire_marshal] */ OLECHAR *BSTR;
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

соответственно BSTR не структура. И по идее его можна заменить на wchar_t, кстати не пробывал?
1.8K
10 мая 2008 года
Arkady
153 / / 18.12.2007
Цитата: Se AD WMD
Можна, BSTR фактически wchar_t, а оператор new заменяет тут SysAllocString - только SysAllocString сам объявляет нужный размер и копирует в BSTR строку
Если посмотреть на объявление то видем такое:
 
Код:
typedef /* [wire_marshal] */ OLECHAR *BSTR;
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

соответственно BSTR не структура. И по идее его можна заменить на wchar_t, кстати не пробывал?



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

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