Indy HTTP - Błąd pamięci.

Odpowiedz Nowy wątek
ZiuTek
2013-07-18 23:34
ZiuTek
0

Witam. Mam problem z komponentem indy http. Mój problem polega na tym, że przy ponownym wywołaniu komponentu program wywala błąd "Access violation at address 004C9450 at module 'Project1.exe'. Read of address 00000118." Wszystko działa jak należy przy pierwszym wywołaniu a przy następnym za każdym razem otrzymuję taki błąd. Jak uniknąć tego błędu?

Pokaż kod i @kAzek łap imdyka ;) - olesio 2013-07-18 23:44

Pozostało 580 znaków

ZiuTek
2013-07-18 23:55
ZiuTek
0

Oto kod:

function CheckUpdates(auto : boolean = false) : boolean;
var
  exename : string;
  dlfile : TFileStream;
  ini : TIniFile;
  vminor : integer;
  vmajor : integer;
  vlink : string;
begin
exename := extractFileName(Application.ExeName);
if fileexists(ExtractFilePath(ParamStr(0)) + 'update.exe') then
begin
    dlfile := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'version.ini', fmcreate);
    main.idhttp1.Request.UserAgent := 'Mozilla/4.0, Indy Library (Windows; en-US)';
    main.idhttp1.Get('http://10.10.1.12/version.ini',dlfile);
    main.IdHttp1.Free;
    dlfile.Free;
    if FileExists(ExtractFilePath(ParamStr(0)) + 'version.ini') then
    begin
        ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'version.ini');
        try
          vminor := StrToInt(ini.ReadString('VERSION', 'MINOR', IntToStr(minor)));
          vmajor := StrToInt(ini.ReadString('VERSION', 'MAJOR', IntToStr(major)));
          vlink := ini.ReadString('UPDATE', 'LINK', '');
          if (vminor > minor) or (vmajor > major) then
          begin
          ShowMessage(Application.Title);
              case Application.MessageBox('Dostępna jest nowa wersja programu.'+#13+'Czy chcesz dokonać aktualizacji?', 'Aktualizacja', MB_YESNO+MB_ICONQuestion) of
                  IDYES: ShellExecute(0, 'open', 'update.exe', PChar(vlink + ' ' + exename + ' "' + Application.Title + '"'), nil, SW_SHOWNORMAL)
              end;
          end else
              if auto then
              Application.MessageBox('Brak dostępnych aktualizacji.', 'Aktualizacja', MB_OK+MB_ICONInformation);

          DeleteFile(ExtractFilePath(ParamStr(0)) + 'version.ini');
        finally
            ini.Free;
        end;
    end else
        if auto then
        Application.MessageBox('Brak dostępnych aktualizacji.', 'Aktualizacja', MB_OK+MB_ICONInformation);
end else
Application.MessageBox('Wystąpił błąd podczas sprawdzania dostępności aktualizacji!'+#13+'Ponowna instalacja programu powinna rozwiązać ten problem.', 'Aktualizacja', MB_OK+MB_ICONError);
end;
Kod średnio udany dla systemów z włączonym UAC, poza tym nie lepiej pobierać ini do pamięci i ewentualnie jeśli potrzebuje jego zawartości updater to mu go przekazać albo przez WM_COPYDATA albo wywołać z odpowiednimi parametrami. A z samym indorem to umie tutaj pomóc tylko wspomniany przeze mnie user. - olesio 2013-07-19 00:05

Pozostało 580 znaków

2013-07-19 00:12

Rejestracja: 15 lat temu

Ostatnio: 14 godzin temu

Zwalniasz komponent IdHttp1, a przed kolejnym skorzystaniem z tej funkcji zapewne zapominasz o jego utworzeniu. Poza tym ten kod jest fatalny.

Pozostało 580 znaków

ZiuTek
2013-07-19 00:25
ZiuTek
0

Fatalny czy nie do poznania języka jak najbardziej wystarczy. Dzięki za pomoc. Miłej nocy.

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0