wchar_t wc[4];
mbstowcs(wc, "alba", 4);
BSTR bwc = SysAllocString(wc);
Работа с BSTR
Подскажите пожалуйста, вот есть код
Код:
Я создал массив wchar-ов длиною 4.
Положил в него слово "alba" длиною 4.
Создал переменную BSTR bwc, используя специальную для этого функцию, положив туда свою переменную alba.
Слово, которое лежит в bwc - "al", длиною 2.
Как такое может быть?
Цитата: Arkady
Здравствуйте,
Подскажите пожалуйста, вот есть код
Я создал массив wchar-ов длиною 4.
Положил в него слово "alba" длиною 4.
Создал переменную BSTR bwc, используя специальную для этого функцию, положив туда свою переменную alba.
Слово, которое лежит в bwc - "al", длиною 2.
Как такое может быть?
Подскажите пожалуйста, вот есть код
Код:
wchar_t wc[4];
mbstowcs(wc, "alba", 4);
BSTR bwc = SysAllocString(wc);
mbstowcs(wc, "alba", 4);
BSTR bwc = SysAllocString(wc);
Я создал массив wchar-ов длиною 4.
Положил в него слово "alba" длиною 4.
Создал переменную BSTR bwc, используя специальную для этого функцию, положив туда свою переменную alba.
Слово, которое лежит в bwc - "al", длиною 2.
Как такое может быть?
А в чем смысл твоих исследований? В Билдере рекомендуется использовать тип WideString.
ЗЫ: По моему в SysAllocString передается AnsiString, но это надо уточнить.
А как заставить это работать так, чтобы я его понимал?
CComBSTR есть еще обертка для BSTR под COM
Код:
wchar_t wc[4];
mbstowcs(wc, "alba", 5);
BSTR bwc = SysAllocString(wc);
Edit1->Text=bwc;
mbstowcs(wc, "alba", 5);
BSTR bwc = SysAllocString(wc);
Edit1->Text=bwc;
Работает нормально, именно с 5.
Такой ещё вопрос по BSTR.
Вот у меня есть строка длинною в 80 символов. При этом разумных там 12, а оставшееся мусор, в том числе нулевые символы.
Как мне сделать BSTR, которое бы вобрало в себя целиком всю строчку на 80 и имело эту длину.
Код:
wchar_t* wStr;
BSTR* Mem;
wStr = (wchar_t*)malloc(80);
mbstowcs(wStr, upinfo->orgname, 80);
Mem = SysAllocString(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 всё равно будет нужная строка в целостности?
Что-то я вообще не могу найти функцию для этого, возникает вопрос - зачем тогда было делать BSTR именно такой, если главным её бонусом пользоваться можно только если руками в память лезть, судя по всему...
Помогите! =) Так и не нашел решение)
Код:
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
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 её можно решить?
Цитата: Se AD WMD
Ну например вот так:
З.Ы. имхо гемор
З.З.Ы. А какая конкретно задача? Может и без BSTR её можно решить?
Код:
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
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 слов (большая часть короткие), поэтому я хочу одной строкой =)
К тому же это не противоречит концепции системы, т.к. там эта структура тоже рассматривается строкой.
Цитата: Arkady
Только разве так можно:
???
BSTR это же не тип, а скорее структура данных... такое объявление точно вернет указатель на нужное место?
Код:
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
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
соответственно BSTR не структура. И по идее его можна заменить на wchar_t, кстати не пробывал?
Цитата: Se AD WMD
Можна, BSTR фактически wchar_t, а оператор new заменяет тут SysAllocString - только SysAllocString сам объявляет нужный размер и копирует в BSTR строку
Если посмотреть на объявление то видем такое:
соответственно BSTR не структура. И по идее его можна заменить на wchar_t, кстати не пробывал?
Если посмотреть на объявление то видем такое:
Код:
typedef /* [wire_marshal] */ OLECHAR *BSTR;
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
соответственно BSTR не структура. И по идее его можна заменить на wchar_t, кстати не пробывал?
wchar_t не отвечает нужным условиям для диспетчеризации и не поддерживается маршалингом олешной либы. А так да, где можно заменяю.