Использование Win32 ReadFile и malloc - PullRequest
0 голосов
/ 03 марта 2011

Моя динамически размещаемая переменная обрезается с помощью SecureZeroMemory, затем ReadFile заполняет ее короткой 5-символьной строкой и набором оставшихся квадратов. Проблема заключается в нежелательных символах в конце строки:

"двигатель 췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍 췍췍"

Параметр lpNumberOfBytesRead в файле ReadFile показывает, что строка имеет значение 10 символов, потому что это Unicode?

Может ли кто-нибудь помочь мне показать, как удалить эти ненужные символы? Есть ли такая функция, как ZeroMemory, которая их очищает?

TCHAR *sIncoming;
sIncoming = (TCHAR *) malloc(sizeof(TCHAR) * 4096 +  sizeof(TCHAR));
RtlZeroMemory(sIncoming ,sizeof(sIncoming));

// (a string array with no characters in it: "")

bSuccess = ReadFile(hPipe,sIncoming ,BUFSIZE*sizeof(TCHAR),&dwBytesRead,NULL);

// Now the string array has the incoming string plus extra characters in it: 
//    "motor췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍"

free(sIncoming);

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Завершение нуля (после успешного звонка на ReadFile, конечно):

sIncoming[dwBytesRead/sizeof(TCHAR)] = 0;

Примечание: соблюдайте ограничения буфера.

Полный вклеен в ваш код:

#define BUFSIZE 4096
TCHAR *sIncoming;
sIncoming = (TCHAR *) malloc(sizeof(TCHAR)*BUFSIZE+sizeof(TCHAR));
bSuccess = ReadFile(hPipe,sIncoming ,BUFSIZE*sizeof(TCHAR),&dwBytesRead,NULL);
if(bSuccess)
  sIncoming[dwBytesRead/sizeof(TCHAR)] = 0;
free(sIncoming);

Редактировать: Удален вызов RtlZeroMemory, поскольку он не является строго обязательным. Просто не забудьте завершить полученную C-строку нулем.

0 голосов
/ 03 марта 2011

sizeof (sIncoming) - размер указателя. Вы хотите sizeof (TCHAR) * 4097. Или просто используйте calloc.

...