Странное поведение ReadFile, когда буфер CString - PullRequest
0 голосов
/ 30 июня 2011

Я унаследовал код, используя ReadFile метод Windows API для чтения одного байта из параллельного порта в цикле.

Код передал CString instance в качестве аргумента буфера, а 1 - количество прочитанных байтов, что-то вроде этого:

CString inBuffer = "";
bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);
allData += inBuffer.GetBuffer(1);

Он долго работал с этим кодом, но иногда вызывал странные проблемы, например, ввод, отправленный с машины, когда «AV01000» читался как «AkVk0k1k0k0k0» - каким-то образом какой-то случайный символ добавлялся после каждого прочитанного символа.

Мне потребовалось много времени, чтобы выяснить источник этого поведения, и после изменения кода на:

char buffer = '\0';
bResult = ReadFile(hCom, &buffer, 1, &nBytesRead, NULL);
allData += buffer;

Он работал безупречно, считывая точные данные, отправленные машиной.

Это некое переполнение буфера во внутреннем коде CString? Если нет, что может объяснить это странное поведение?

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Удалить адрес оператора:

bResult = ReadFile(hCom, inBuffer.GetBuffer(1), 1, &nBytesRead, NULL);

Также: не забудьте соответствующий вызов ReleaseBuffer. И для добавления этого символа

allData += inBuffer;

должно быть достаточно.

0 голосов
/ 30 июня 2011

Во-первых, CString действует в соответствии с кодировкой, выбранной вами для проекта.Если ваш проект в формате Unicode, каждый символ хранится в символе CString, представленном в двух байтах (WCHAR).Если файл и объект имеют одинаковую кодировку, он будет работать нормально.(Также вы можете определить кодировку файла, проанализировав символ BOM в начале)

Размер буфера, который вы передаете, равен 1. Если вы все еще хотите использовать объект CString, передайте правильный размер буферапередавая длину файла, вызывая API GetFileSize ().

Я предлагаю вам использовать метод выделения буфера.

вроде

char* pReadbuff = new char[sizeoffile];
ReadFile(..);
CString objStr = pReadbuff;
delete pReadbuff;
...