Вы знаете, что char
- это символ Unicode со времен Delphi 2009, но символ ANSI до Delphi 2009. Точно так же в Delphi 2009 string
- это UnicodeString
, а не AnsiString
.
Итак, когда вы пишете SetLength(text, Reserved)
, вы устанавливаете количество символов в text
на Reserved
. Но количество байтов будет 2*Reserved
.
Другими словами, в Delphi 2009+ один char
- это не один byte
, а два байта.
Вы можете вернуть старое поведение, заменив все char
на AnsiChar
и все string
на AnsiString
.
Обновление
Поскольку вы не опубликовали весь свой код, я не могу точно сказать, в чем проблема. Тем не менее, вам может быть интересно прочитать мой пример использования InternetReadFile в Delphi. Смотрите мой ответ на этот вопрос . Это полностью рабочий пример того, как читать текстовые файлы из Интернета, используя Delphi и InternetReadFile
.
Для вашего удобства я также вставляю свой код ниже:
Для чтения данных из Интернета используйте функцию InternetReadFile
. Я использую следующий код для чтения небольшого (однострочного) текстового файла из Интернета:
function WebGetData(const UserAgent: string; const Server: string; const Resource: string): string;
var
hInet: HINTERNET;
hURL: HINTERNET;
Buffer: array[0..1023] of AnsiChar;
i, BufferLen: cardinal;
begin
result := '';
hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenUrl(hInet, PChar('http://' + Server + Resource), nil, 0, 0, 0);
try
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
if BufferLen = SizeOf(Buffer) then
result := result + AnsiString(Buffer)
else if BufferLen > 0 then
for i := 0 to BufferLen - 1 do
result := result + Buffer[i];
until BufferLen = 0;
finally
InternetCloseHandle(hURL);
end;
finally
InternetCloseHandle(hInet);
end;
end;
Пример использования:
WebGetData('My UserAgent', 'www.rejbrand.se', '/MyDir/update/ver.txt')