GZip Indy10 Delphi XE2
Читаю файл
www.wowprogress.com/export/ranks/eu_%D1%8F%D1%81%D0%B5%D0%BD%D0%B5%D0%B2%D1%8B%D0%B9-%D0%BB%D0%B5%D1%81_tier13.json.gz
распаковываю его
var
SrcStream, DestStream: TStringStream;
GZStream: TDecompressionStream;
BytesRead: integer;
MainBuffer: array[0..1023] of AnsiChar;
begin
SrcStream := TStringStream.Create;
DestStream := TStringStream.Create;
try
Address := 'http://www.wowprogress.com/export/ranks/eu_%D1%8F%D1%81%D0%B5%D0%BD%D0%B5%D0%B2%D1%8B%D0%B9-%D0%BB%D0%B5%D1%81_tier13.json.gz';
Address := TIdURI.URLEncode(string(UTF8Encode(Address)));
DM.IdHTTPconnect.Get(Address, SrcStream);
SrcStream.Position := 0;
GZStream := TDecompressionStream.Create(SrcStream); [b]
try
DestStream.Position := 0;
GZStream.Position := 0;
try
repeat
bytesread:=GZStream.Read(mainbuffer,SizeOf(MainBuffer));
DestStream.Write(mainbuffer,bytesread);
until bytesread < 1024;
except
GZStream.Free;
exit;
end;
До этого проект был на Delphi 2010 - все нормально отрабатывало.
Решил попробовать в XE2, в отладке прошелся внуть Indy, дошел до вызова
function inflateInit2(var strm: z_stream; windowBits: TIdC_INT): TIdC_INT;
begin
if not Assigned(strm.zalloc) then begin
strm.zalloc := zlibAllocMem;
end;
if not Assigned(strm.zfree) then begin
strm.zfree := zlibFreeMem;
end;
Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, SizeOf(z_stream));
end;
Вот на этой строчке - AV как будто стек портится
Достал исходники ZLib 1.2.5, подсунул - там вообще чушь
int ZEXPORT inflateInit2_(strm, windowBits, version, [b]stream_size[/b])
z_streamp strm;
int windowBits;
const char *version;
int stream_size;
{
int ret;
struct inflate_state FAR *state;
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
stream_size != (int)(sizeof(z_stream)))
return Z_VERSION_ERROR;
// Возврат идет отсюда