Strona 1 z 1

Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 17:17
przez Pitek
Witam mam sobie funckję aktualizacji może jest ona prowizoryczna i prymitywna ale jest i działa ale nie dokońca nawet nie wiem czemu.
Dziwne jest to że za 1 razem działa bez zarzutu tak jak ma być ale jeżeli podczas jednego działania programu odpali się to drugi raz wyskakuje okienko jak w załączniku.Poniżej przedstawiam kod tej funckji oraz kody okien dodatkowych (proszę o jakąś wyrozumiałość jest on fajnie wyglądający ale może nie w 100% poprawny proszę więc o wytłumaczenie a nie OPR :oops: ):
Kod główny :
Kod: Zaznacz cały
String update;

    IdFTP1->Connect();
    IdFTP1->Get("update.txt", "update.txt", true, false);
    IdFTP1->Disconnect();
    Form5->Show();

    char *Buf = new char[255];

    ifstream infile;
    infile.open("update.txt");
    infile >> Buf;
    infile.close();

    update = Buf;
    delete Buf;
    DeleteFile("update.txt");
    wersja = GetFileVersionInfo(NULL, "FileVersion");
    Form5->Close();
    Boolean Result = SameText(update, wersja);

    if(!Result)
    {
    FormMsg->ShowModal();
    }
    else
    {
      MessageBox(NULL,"Posiadana wersja jest aktualna !","Update",MB_ICONINFORMATION|MB_OK);
    }

Kod okna który dostałem od Cyfrowego Barona przerobiony bo wsumie odszedłem w tym miejscu od linku (ale go używam gdzie indziej) :
Kod: Zaznacz cały
void __fastcall TFormMsg::Button1Click(TObject *Sender)
{
Close();   
}
//---------------------------------------------------------------------------
void __fastcall TFormMsg::FormClose(TObject *Sender, TCloseAction &Action)
{
if(zamykanie==true)
{
   Action = caNone;
}
else
{
Action = caFree;
}
if(pobrano==true)
{
ShellExecute(FormMsg->Handle, NULL , "setup.exe", "", "", SW_SHOWNORMAL);
}
Label2->WindowProc = OldLabelH;
}
//---------------------------------------------------------------------------
void __fastcall TFormMsg::FormShow(TObject *Sender)
{
Label1->Caption="Dostępna jest nowa aktualizacja programu !\nCzy chcesz dokonać aktualizacji ?";
ProgressBar1->Position=0;
}
//---------------------------------------------------------------------------

void __fastcall TFormMsg::Button2Click(TObject *Sender)
{
Button1->Enabled=false;
zamykanie=true;
ProgressBar1->Visible=true;
IdFTP2->Connect();
ProgressBar1->Max = IdFTP2->Size("setup.exe");
Application->ProcessMessages();
IdFTP2->Get("setup.exe", "setup.exe", true, false);
IdFTP2->Disconnect();

FormMsg->Close();

}
//---------------------------------------------------------------------------

void __fastcall TFormMsg::IdFTP2Work(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)

{
ProgressBar1->Position = AWorkCount;
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TFormMsg::IdFTP2WorkEnd(TObject *ASender, TWorkMode AWorkMode)
{
ProgressBar1->Position = ProgressBar1->Max;
pobrano=true;
zamykanie=false;
}
//---------------------------------------------------------------------------

A tutaj kod okna którego użyłem dla fajnego wyglądu i troche dla bajeru ;) :
Kod: Zaznacz cały
void __fastcall TForm5::FormActivate(TObject *Sender)
{
long style = GetWindowLong(ProgressBar1->Handle, GWL_STYLE);
style = style | PBS_MARQUEE;
SetWindowLong(ProgressBar1->Handle, GWL_STYLE, style);

// Rozpoczęcie odliczania
ProgressBar1->Perform(PBM_SETMARQUEE, true, 100);

for(int i = 0; i < 80; i++)
{
  ProgressBar1->Position += 1;
  Sleep(100);
  Application->ProcessMessages();
}

// Zakończenie odliczania
ProgressBar1->Perform(PBM_SETMARQUEE, false, 100);
}
//---------------------------------------------------------------------------

Jeszcze raz proszę o wyrozumiałość oraz pomoc !
Treść okna pojawia się za drugim raze przy jednym otwarciu okna i powtarza się bez końca ale tyko wtedy kiedy jest dostępna aktualizacja bo jeżeli nie to MessageBox informujący o jej braku działa normalnie :

Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:10
przez Cyfrowy Baron
W całym tym bałaganie, który tutaj ukazałeś, nie dostrzegam błędu, na który wskazywałby ten komunikat. Masz coś ze zmiennymi lub obiektami, to błąd w dostępnie do pamięci, odwołujesz się do adresu w pamięci, który nie istnieje. Tak mi się wydaje.

Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:19
przez Pitek
Dorzuce jeszcze coś co pojawia się po kliknięciu Break w środowisku to ta linia :

Result := AutoScroll or (HorzScrollBar.Range <> 0) or (VertScrollBar.Range <> 0);


Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:21
przez Cyfrowy Baron
Nic mi to nie mówi.
Po wywołaniu którego kodu wyskakuje ten błąd?

Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:26
przez Pitek
Zaczyna się kodem podanym przeze mnie jako pierwszy on potem otwiera kod ostatni a potem środkowy.

Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:32
przez Cyfrowy Baron
Nie to nigdy tak nie jest. Błąd wywołuje tylko fragment kodu i to musisz zlokalizować, gdyż z Twojego kodu nie wynika, że gdzieś powinien pojawić się taki błąd.

Re: Błąd Access Violation

Nowy postNapisane: poniedziałek, 4 stycznia 2010, 18:37
przez Pitek
To znaczy błąd pojawia się w kodzie nr. 1 bo jak dałem tam try ... catch to mi to wyłapał ale czemu i czemu za 2 razem ?
P.S.Proszę o rozmowę na czacie :)