powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / char в BSTR
16 сообщений из 16, страница 1 из 1
char в BSTR
    #32287735
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как мне преобразовать тип char в BSTR.
Ну допустим:

char* a = malloc(5);
BSTR b;

strncpy("a","тест",4)

И далее что?
...
Рейтинг: 0 / 0
char в BSTR
    #32288074
123456789098
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
типа так ?
Код: plaintext
1.
2.
char *d= "srgsr" ;
  WideString a=d;
  BSTR bt=a.c_bstr();
...
Рейтинг: 0 / 0
char в BSTR
    #32288131
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не совсем понятно.
WideString a=d; - это как понимать? Плииз , можно развернуто ?
У меня прокатило вот так:
.................
CComBSTR bstrString(szBuf);
myAtl->put_DataPort(bstrString);
::SysFreeString(bstrStrin)
............
...
Рейтинг: 0 / 0
char в BSTR
    #32288368
Фотография Yet another cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так ты 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.
String Conversion Macros
The string conversion macros discussed here are valid for both ATL and MFC. For more information on MFC string conversion, see TN059: Using MFC MBCS/Unicode Conversion Macros and MFC Macros and Globals.

The syntax of the string-conversion macros is:

MACRONAME( string_address )

For example:

A2W(lpa)

In the macro names, the source string type is on the left (for example, A) and the destination string type is on the right (for example, W). A stands for LPSTR, OLE stands for LPOLESTR, T stands for LPTSTR, and W stands for LPWSTR.

Thus, A2W converts an LPSTR to an LPWSTR, OLE2T converts an LPOLESTR to an LPTSTR, and so on.

The destination string is created using _alloca, except when the destination type is BSTR. Using _alloca allocates memory off the stack, so that when your function returns, it is automatically cleaned up.

If there is a C in the macro name, the macro converts to a const string. For example, W2CA converts an LPWSTR to an LPCSTR.

Note   When using an ATL string conversion macro, specify the USES_CONVERSION macro at the beginning of your function in order to avoid compiler errors. For example:

void func( LPSTR lpsz )
{
   USES_CONVERSION;
   ...
   LPWSTR x = A2W(lpsz)
   // Do something with x
   ...
}

The behavior of the ATL string conversion macros depends on the compiler directive in effect, if any. If the source and destination types are the same, no conversion takes place. Compiler directives change T and OLE as follows:

Compiler directive in effect T becomes OLE becomes 
none                              A              W 
_UNICODE                       W             W 
OLE2ANSI                       A              A 
_UNICODE and OLE2ANSI   W             A 


The following table lists the ATL string conversion macros.

ATL String Conversion Macros

A2BSTR OLE2A T2A W2A 
A2COLE OLE2BSTR T2BSTR W2BSTR 
A2CT OLE2CA T2CA W2CA 
A2CW OLE2CT T2COLE W2COLE 
A2OLE OLE2CW T2CW W2CT 
A2T OLE2T T2OLE W2OLE 
A2W OLE2W T2W W2T


Для BSTR подойдут макросы с OLE в названии.

=====
Не дождетесь!
...
Рейтинг: 0 / 0
char в BSTR
    #32288876
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так-то оно так, да не так.
У в строке содержаться нулевые символы, при переводе в BSTR оказывается только часть строки, до первого нулевого. Я так понимаю что нужно ручками принудительно запихнуть в BSTR тип char.
Как это делается?
...
Рейтинг: 0 / 0
char в BSTR
    #32289386
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
формат BSTR:

| 4 байта - длина строки | широкая строка, каждый символ - 2 байта | 00 - нулевой широкий символ.

сам BSTR определен как wchar_t*, и указывает на начало самой строки, а не на поле длины.

держи:
Код: plaintext
1.
2.
3.
#define DEF_STR(name, wstr) \
	struct { size_t size; wchar_t str[sizeof(wstr)]; \
	operator BSTR() { return str; } }\
	name={ sizeof(wstr)/ 2 - 1 , wstr }

использовать:
Код: plaintext
1.
2.
3.
4.
DEF_STR(field1_name, L "Amount" );
DEF_STR(field2_name, L "ID" );
...
_Field* f1=fields->Item(field1_name);


если надо автоматизировать создание, удаление, присвоение обычной строки и т.д. бери comutil.h, и в нем используй _bstr_t - тип, это высокоуровневый ропер над BSTR.
Это независимый такой файл, я думаю он легко на BCB скомпилится.

Что касается твоего примера:
автор писал:А как мне преобразовать тип char в BSTR.
Ну допустим:

char* a = malloc(5);
BSTR b;

strncpy("a","тест",4)

И далее что?

Код: plaintext
1.
2.
BSTR b=(BSTR)((int*)(malloc( 5 * 2 + 4 ))+ 1 );

do { *b++=*a; } while (a++); 

Но это будет верно только для латинской кодировки, для других кодировок надо перегонять через таблицу преобразований codepage -> unicode.
...
Рейтинг: 0 / 0
char в BSTR
    #32289881
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы.
Но хотелось бы понять.
Что нужно-то.
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?
Мало того, как мне потом все это преобразовать обратно , без потерь?
Помогите, мастера?
...
Рейтинг: 0 / 0
char в BSTR
    #32290302
Flex2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тема-то интересная :)
...
Рейтинг: 0 / 0
char в BSTR
    #32290843
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Flex2

Посмотри еще раз структуру BSTR, которую я приводил, подумай наконец!

Если тебе надо передавать данные через BSTR, то у тебя есть 1000 способов это сделать.

Еще один способ:
Предположим, что у тебя всегда четное количество байт в буфере, который ты хочешь использовать. Согласно структуре BSTR делаем свой буфер для передачи данных через BSTR:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
template<size_t SIZE>
struct BinBstr {
  size_t size;            // заголовок
  wchar_t buff[SIZE/ 2 + 1 ];    // тело

  operator BSTR() { return buff; }
  BinBstr() : size(SIZE/ 2 ) { buff[SIZE/ 2 ]= 0 ; }
  unsigned char& operator[](size_t index) {
    ASSERT(index<SIZE);
    return ((unsigned char*)buff)[i];
  }
}

использовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface IMyInterface {
   HRESULT Send(BSTR data);
}

...

BinBstr< 100 > buf;
for(...) { buf[i]=...;}

IMyInterface* mi=....;
HRESULT hr=mi->Send(buf);


но это статический буфер.
как домашнее задание - динамический на std::vector;

подсказки:
элемент контейнера - wchar_t
первые 2 элемента - отведешь под длину
переопредели оператор [], чтобы указывать на правильное место в векторе
переопредели оператор BSTR, чтобы указывать на правильное место в векторе
переопредели все операции, изменяющие длину вектора, перед вызовом оригинала скорректируешь индексы или заданное количество элементов, после вызова оригинальной версии скорректируешь значение в первых 2-х элементах.
...
Рейтинг: 0 / 0
char в BSTR
    #32291023
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
const char* pStr = "Hello ...";
WCHAR wBuff[10];
BSTR bsTr;

MultiByteToWideChar(CP_ACP, 0, pStr, -1, wBuff, 10);
bsTr = SysAllocString(wBuff);
SysFreeString(bsTr);
...
Рейтинг: 0 / 0
char в BSTR
    #32291032
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К вопросу о формате 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
...
Рейтинг: 0 / 0
char в BSTR
    #32291192
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты прав, только зачем ему каждый раз создавать копию пакета? (см зачем это ему надо)

Да и с длиной выделенной по API строки не поиграешь...
Пусть делает динамический буфер на vector<> :)
...
Рейтинг: 0 / 0
char в BSTR
    #32291270
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор писал:Вот тут операция чтения из COМ порта, в буффере допустим лежит:
{0x00,0x0F,0x01,0xA4,0x00,0x01,0xFC,0xFD,0x00} Причем, все байты значимы.!!!
Соответсвенно количесво прочитанных байт я знаю, там функция чтения из порта мне возвращает их.

bsTr = SysAllocStringLen(wBuff, len);

для WCHAR-буфера известной длины len - самое простое решение
...
Рейтинг: 0 / 0
char в BSTR
    #32293670
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибка, братец:

bsTr = SysAllocStringLen(wBuff, len/2);
...
Рейтинг: 0 / 0
char в BSTR
    #32293827
_Konst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, конечно, под len понималась длина буфера не в байтах, а в "двойных" байтах
Код: plaintext
wBuff = new WCHAR[len];
...
Рейтинг: 0 / 0
char в BSTR
    #32294735
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да эт я так
че нам? написать полностью прогу?
было сказано более чем достаточно - выбирай на вкус...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / char в BSTR
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]