
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
08.10.2003, 15:02
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
А как мне преобразовать тип char в BSTR. Ну допустим: char* a = malloc(5); BSTR b; strncpy("a","тест",4) И далее что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.10.2003, 17:51
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
типа так ? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.10.2003, 18:33
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
не совсем понятно. WideString a=d; - это как понимать? Плииз , можно развернуто ? У меня прокатило вот так: ................. CComBSTR bstrString(szBuf); myAtl->put_DataPort(bstrString); ::SysFreeString(bstrStrin) ............ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.10.2003, 09:08
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
Так ты ATL таки пользуешь или нет, если да, то почему бы не воспользоваться Conversion Macros? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Для BSTR подойдут макросы с OLE в названии. ===== Не дождетесь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.10.2003, 14:03
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
Так-то оно так, да не так. У в строке содержаться нулевые символы, при переводе в BSTR оказывается только часть строки, до первого нулевого. Я так понимаю что нужно ручками принудительно запихнуть в BSTR тип char. Как это делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.10.2003, 20:22
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
формат BSTR: | 4 байта - длина строки | широкая строка, каждый символ - 2 байта | 00 - нулевой широкий символ. сам BSTR определен как wchar_t*, и указывает на начало самой строки, а не на поле длины. держи: Код: plaintext 1. 2. 3. использовать: Код: plaintext 1. 2. 3. 4. если надо автоматизировать создание, удаление, присвоение обычной строки и т.д. бери comutil.h, и в нем используй _bstr_t - тип, это высокоуровневый ропер над BSTR. Это независимый такой файл, я думаю он легко на BCB скомпилится. Что касается твоего примера: автор писал:А как мне преобразовать тип char в BSTR. Ну допустим: char* a = malloc(5); BSTR b; strncpy("a","тест",4) И далее что? Код: plaintext 1. 2. Но это будет верно только для латинской кодировки, для других кодировок надо перегонять через таблицу преобразований codepage -> unicode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.10.2003, 13:14
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
Всем спасибо за ответы. Но хотелось бы понять. Что нужно-то. 1. Перевести char в wchar_t ? 2. Перевести wchar_t в BSTR, так? использовать _bstr_t заманчиво, но у меня компилятор при сборке ругается о том что не хочет ее использовать, выдает LINK 2001. В документации написано что нужно в опциях прекомпиляции убрать настройки типа проекта "минимум" или что мы там выбрали, тогда С подключит СRT и такие функции можно юзать. Но что-то у меня не получилось. Но суто-то не в этом. Вот у меня буфер: char buff[255]; // Буффер DWORD dwCntRead; // Тут количесво прочитанных байт ............................................................................ Вот тут операция чтения из COМ порта, в буффере допустим лежит: {0x00,0x0F,0x01,0xA4,0x00,0x01,0xFC,0xFD,0x00} Причем, все байты значимы.!!! Соответсвенно количесво прочитанных байт я знаю, там функция чтения из порта мне возвращает их. Мне, для мониторинга нужно это дело передать в приложение. Тип данных для обмена COM->Приложение является BSTR. так ATL захотела. И что? Как мне это дело запихнуть в BSTR? Мало того, как мне потом все это преобразовать обратно , без потерь? Помогите, мастера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.10.2003, 17:34
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
А тема-то интересная :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.10.2003, 01:36
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
Уважаемый Flex2 Посмотри еще раз структуру BSTR, которую я приводил, подумай наконец! Если тебе надо передавать данные через BSTR, то у тебя есть 1000 способов это сделать. Еще один способ: Предположим, что у тебя всегда четное количество байт в буфере, который ты хочешь использовать. Согласно структуре BSTR делаем свой буфер для передачи данных через BSTR: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. использовать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. но это статический буфер. как домашнее задание - динамический на std::vector; подсказки: элемент контейнера - wchar_t первые 2 элемента - отведешь под длину переопредели оператор [], чтобы указывать на правильное место в векторе переопредели оператор BSTR, чтобы указывать на правильное место в векторе переопредели все операции, изменяющие длину вектора, перед вызовом оригинала скорректируешь индексы или заданное количество элементов, после вызова оригинальной версии скорректируешь значение в первых 2-х элементах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.10.2003, 11:24
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
const char* pStr = "Hello ..."; WCHAR wBuff[10]; BSTR bsTr; MultiByteToWideChar(CP_ACP, 0, pStr, -1, wBuff, 10); bsTr = SysAllocString(wBuff); SysFreeString(bsTr); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.10.2003, 11:34
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
К вопросу о формате BSTR: Предыдущих пример, но слегка модифицированный const char* pStr = "Hello .."; WCHAR wBuff[10]; BSTR bsTr; int len; MultiByteToWideChar(CP_ACP, 0, pStr, -1, wBuff, 10); bsTr = SysAllocString(wBuff); len = *(int*)(bsTr - 2); ::SysFreeString(bsTr); Вообще же BSTR объявлен как typedef OLECHAR* BSTR а различия между ними сводятся к тому, что реальный BSTR начинается за два символа (под длину в байтах) до того, который хранится в указателе, для этого видимо и ввели специальные ф-ии по работе с BSTR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.10.2003, 13:24
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
Ты прав, только зачем ему каждый раз создавать копию пакета? (см зачем это ему надо) Да и с длиной выделенной по API строки не поиграешь... Пусть делает динамический буфер на vector<> :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.10.2003, 14:26
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
автор писал:Вот тут операция чтения из COМ порта, в буффере допустим лежит: {0x00,0x0F,0x01,0xA4,0x00,0x01,0xFC,0xFD,0x00} Причем, все байты значимы.!!! Соответсвенно количесво прочитанных байт я знаю, там функция чтения из порта мне возвращает их. bsTr = SysAllocStringLen(wBuff, len); для WCHAR-буфера известной длины len - самое простое решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.10.2003, 10:15
|
|||
|---|---|---|---|
char в BSTR |
|||
|
#18+
ошибка, братец: bsTr = SysAllocStringLen(wBuff, len/2); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.10.2003, 11:50
|
|||
|---|---|---|---|
|
|||
char в BSTR |
|||
|
#18+
Да, конечно, под len понималась длина буфера не в байтах, а в "двойных" байтах Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2035887]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 335ms |

| 0 / 0 |
