OPOS BSTR * неправильно конвертируется

Поэтому после нескольких исследований я обнаружил, что использование WideCharToMultiByte отлично работает для отправки данных из объекта управления через OPOS в мою пользовательскую SO. хорошо мы столкнулись с ошибкой. В части DirectIO карта объекта управления C # — DirectIO (команда int, ref int data, ref string object);

и для самых длинных нам нужно было только отправить простые команды через DirectIO. Например, чтобы включить светодиод, мы должны установить длину данных в миллисекундах и цвет объекта. Когда нам нужно было записать данные в тег или карту, текст должен был быть проанализирован из специальной строки в стиле XML в байтовый массив … ну, теперь возникла необходимость в том, чтобы нам был байтовый массив, используйте кодировку ASCII поместить этот массив в строковую форму и написать

Проблема возникает из-за того, что когда я конвертирую эту строку в мой объект службы, она не конвертируется правильно. кажется, что он останавливается на нуле, хотя SysStringLen знает, что длина составляет 4 байта. пример Объект управления делает это

        int page = 16;
byte[] data = new byte[] { 0x19, 0x00, 0x30, 0x00 };
string pData = System.Text.ASCIIEncoding.ASCII.GetString(data);
msr.DirectIO(902, ref page, ref pData);

ТАК видит это

int len = (int)SysStringLen(*pString);
long dataData = *pData;
char* dataObject = new char[1+len];

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);
ByteUtil::LogArray("dataObject", (BYTE*)dataObject, len);

дает выход

dataObject(4)-19:00:00:00

в основном, как только достигнут первый нулевой символ, остальные данные теряются. теперь, если я преобразую число из строки в строку, это работает нормально, потому что у меня есть функция ByteUtil только для этого случая … но мне кажется неправильным делать это … почему я не могу у меня это просто как массив BYTE?

0

Решение

Очень просто, просто измените эту строку:

WideCharToMultiByte(CP_ACP, 0, *pString, -1, dataObject, len, NULL, NULL);

в:

WideCharToMultiByte(CP_ACP, 0, *pString, len, dataObject, len, NULL, NULL);

Если для четвертого параметра установлено значение -1, WideCharToMultiByte обрабатывает входную строку как строку с нулевым символом в конце. BSTR имеют нулевое окончание по соображениям совместимости, но вы никогда не должны обращаться с ними как с нулевым символом в конце, поскольку они могут содержать нулевые символы как часть строки.

2

Другие решения

Других решений пока нет …