_wfopen
- это широкая символьная версия fopen
- вы должны передавать ее L "...", а не TCHAR. Версия TCHAR - _tfopen
(которая сводится к одному из fopen
или _wfopen
) - см .: http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.80%29.aspx
LPBYTE lpByte = (LPBYTE) malloc(lSize);
Если это C, вам не нужно приводить результат malloc. Лично, типы MS LP*
оставляют во рту неприятный вкус - я чувствую, что венгерский язык скрывает читабельность кода для того, кто хорошо разбирается в ... C. Таким образом, я предпочитаю BYTE *
, а не LPBYTE
, но это не собираюсь делать или нарушать код.
fread(lpByte, 1, lSize, fConnect);
Проверьте возвращаемое значение.
lpByte[lSize] = 0;
Как уже упоминалось, этот доступ к памяти находится за пределами массива.
if (!openRes)
return;
DWORD err = GetLastError();
- Вы утечки
lpByte
- Вы звоните
GetLastError()
... в случае успеха?
Далее
LPTSTR sMem = (TCHAR*)GlobalLock(hText);
Хотя я предпочитаю не-LP материал, возможно, выбрать один? (Может быть, сделать бросок LPTSTR
?) Опять же, это не должно иметь значения в конце. (Это также может относиться к категории «Это - malloc, и ему не нужен бросок».)
memcpy(sMem, lpByte, (lSize + sizeof(TCHAR)));
Как уже упоминалось, этот memcpy также обращается к недействительной памяти. В частности, lpByte
имеет длину lSize
, но вы делаете это плюс дополнительный sizeof(TCHAR)
.