Конференция "Сети" » GZip Access violation at 00000038
 
  • Cobalt © (02.09.12 19:52) [0]
    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]// Вот тут происходит AV по адресу 00000038[/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;


    // Возврат идет отсюда
  • RWolf © (02.09.12 20:09) [1]
    так в С записываются типы параметров.
  • DVM © (02.09.12 21:48) [2]

    > Cobalt ©   (02.09.12 19:52) 

    1) Что ты такое пытаешься сделать с URL вот здесь?:

      Address := TIdURI.URLEncode(string(UTF8Encode(Address)));



    2) Не стоит привлекать TStringStream для приема бинарных данных. Т.е

    SrcStream := TStringStream.Create;



    лучше заменить на

    SrcStream := TMemoryStream.Create;



    3) Попробуй так:

     
    procedure Unpack(AStream: TStream);
     var
       UnzippedContent: TStream;
       Unzip: TIdCompressorZLib;
     begin
       AStream.Position := 0;
     
           Unzip := TIdCompressorZLib.Create(nil);
           try
             UnzippedContent := TMemoryStream.Create;
             try
               Unzip.DecompressGZipStream(AStream, UnzippedContent);
               UnzippedContent.Position := 0;
               AStream.Size := 0;
               AStream.CopyFrom(UnzippedContent, UnzippedContent.Size);
             finally
               UnzippedContent.Free;
             end;
           finally
             Unzip.Free;
           end;

     end;

 
Конференция "Сети" » GZip Access violation at 00000038
Есть новые Нет новых   [134435   +20][b:0][p:0.002]