Podmiana samego 'siebie' programu

0

Witam,
Czy ktos ma moze jakis przyklad w postaci jakiegos programu , dzieki ktoremu bede mogl sie wzorowac ?.
Chodzi mi mianowicie o to , ze mam autoupdate programu i chcialbym aby ten program sie podmienil na ta sama nazwe.

Wiem, ze dobrze byloby zeby jakis drugi program go jakos podmienil i potem usunal, ale niestety nie wiem jak to zrobic w postaci 'programowania delphi' wiec jak ktos moglby podac jakis przyklad badz wskazowke, to bede bardzo wdzieczny.
Pozdrawiam

0

Eee.. no ja to zrobiłem tak, że.. mam głowny program, który uruchamiając się sprawdza czy jest aktualizacja, jak tak, to uruchamia z jakimiśtam parametrami updatera i się zamyka. Updater czeka az program glonwny sie zamknie i zaczyna pobieranie nowych plików. Po zakończeniu wyświetla komunikat, że wszystko ok, uruchamia główny program i sam sie wyłącza.

0

Łap//wiki.freepascal.org/Executing_External_Programs powinno pomóc.

0

Dziękuje wszystkim za odpowiedzi.
Zrobiłem , a raczej próbowałem zrobic podmianę programu tak :
Program sprawdza czy jest dostepna nowa wersja , jezeli tak :

  • zakładam, że program nazywa się generator.exe
  • generator sprawdza czy jest nowa wersja, jezeli tak , to 'wyrzuca z zasobow program o nazwie updater.exe'
  • Updater.exe sie uruchamia i sciaga od razu wersje programu ze strony (za pomoca pliku ini) i od razu usuwa plik .ini
  • Updater.exe tworzy plik update.bat, który przeniesie program2 do program.exe i skasuje samego siebie.

Tylko mam problem, mianowicie chce zeby zdarzył update.exe pobrac plik program2.exe zanim sam sie wylaczy i wykona wszystkie funkcje...
Przedstawiam kod updatera.
Chcialbym, zeby wlasnie po sciagnieciu pliku dopiero, uruchomil update.bat i sam sie zamknal , bo jak daje Application.Terminate;
To nie zdarzy sciagnac program2.exe tylko od razu sie wylacza..
Probowalem dac sleep(1000); itd , ale to tak jakby wstrzymuje caly program na taki okres czasu.
Prosze o pomoc.
Zapewne trzeba gdzies dac petle, ze jezeli plik sie sciaganie ...
to dopiero wykonuj instrukcje, ale nie wiem jak to zastosowac dokladniej ,wiec jak ktos moze prosze o pomoc. Jestem poczatkujacy, dopiero sie ucze, chcialem dojsc do tego samemu,lecz no niestety mam problem w 'ostatnim' etapie.

Kod:

procedure TForm1.FormCreate(Sender: TObject);
begin
 HTTPGet1.URL := 'http://www.domena.pl/version.ini';  //lokalizacja pliku z informacją
 HTTPGet1.FileName := ExtractFilePath(Application.ExeName) + 'version.ini';
 HTTPGet1.GetFile;  //pobranie pliku ini
 //Memo1.Lines.Add('Pobieranie informacji...');
end;

procedure TForm1.HTTPGet1DoneFile(Sender: TObject; FileName: String;
  FileSize: Integer);
var
 INI : TINIFile;
 updtVersion : string;
 CF : TextFile;
begin
 INI := TINIFile.Create(HTTPGet1.FileName);
 try
   updtVersion := INI.ReadString('update','version','');  //odcytanie wersji z pliku ini
       begin
       HTTPGet2.URL := INI.ReadString('update','url','');
       HTTPGet2.FileName := ExtractFileDir(ParamStr(0))+ '\program2.exe';
       HTTPGet2.GetFile;  //pobieranie pliku
       end;
 finally
   INI.Free;
   DeleteFile(HTTPGet1.FileName); //usunięcie pliku ini
   AssignFile(CF,ExtractFilePath(ParamStr(0))+ 'update.bat');
   try
        ReWrite(CF);
        WriteLN(CF,'move program2.exe program.exe');
        WriteLN(CF,'program.exe');
        WriteLN(CF,'del update.bat ');
        WriteLN(CF,'exit');
      finally
        CloseFile(CF);
        WinExec('update.bat', SW_SHOW);        <---- uruchamiany bat
        Application.Terminate;         <---- wylaczanie updater.exe
      end; 
   end;
end;

procedure TForm1.HTTPGet2Progress(Sender: TObject; TotalSize,
  Readed: Integer);
begin
  ProgressBar1.Max := TotalSize;
  ProgressBar1.Position := Readed;
end;

end.

LOL , wystarczylo w onDoneFile po prostu dac te dwie komendy.
Problem rozwiazany, do zamkniecia.

1
  • zakładam, że program nazywa się generator.exe
  • generator sprawdza czy jest nowa wersja, jezeli tak , to 'wyrzuca z zasobow program o nazwie updater.exe'
  • Updater.exe sie uruchamia i sciaga od razu wersje programu ze strony (za pomoca pliku ini) i od razu usuwa plik .ini
  • Updater.exe tworzy plik update.bat, który przeniesie program2 do program.exe i skasuje samego siebie.

Trochę to zagmatwane, nie wiem dlaczego chcesz apdejter trzymać w zasobach - niech będzie obok pliku wykonywalnego;

Może spróbuj zrobić inaczej:

- Generator.exe sprawdza, czy dostępna jest nowa wersja,
- jeśli jest:
  - uruchamia Update.exe (jak chcesz to go wypakuj z zasobów),
  - Generator.exe wyłącza się,
  - Update.exe pobiera wszystkie pliki nowej wersji do folderu tymczasowego,
  - jeśli wszystkie pliki zostały pobrane:
    - Update.exe podmienia wszystkie pliki,
    - uruchamia nowy Generator.exe,
    - zamyka się (ewentualnie wcześniej zapisuje odpowiednie informacje o aktualizacji).

W ten sposób unikniesz skutków ubocznych niepoprawnej/niekompletnej aktualizacji;

0

Kolega KASK wszystko chce trzymać w jednym pliku - pewnie tworzy Trojana.

Takiego madrego - autoupdate, jakies wysylanie logow.
Wystarczy przebadac kilka tematow ostatnich, ktore potworzyl :)

0

Cały program zamknąć w BPL.. Exe niech sprawdza czy jest nowa wersja, ewentualnie ściąga nowy BPL i uruchamia BPL.

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