Autoupdate aplikacji

0

Hi.

Problem:
Mam program, średnio 2x w tygodniu robię wyższą wersję.
Z aplikacji korzystają klienci - powiedzmy, że nowe wersje programu dostępne są w udostępnionym folderze na komputerze X.

Pytanie:
Jak zrobić (podejrzewam na procesach) aby program po stwierdzeniu, że dostępna jest nowa wersja aktualizuje sam siebie.
Może być to realizowane np. przez wywołanie innej aplikacji, która zamknie proces programu, a następnie przekopiuje nową wersję i nadpisze starą.
Chodzi mi o zarządzanie procesami w takim przypadku - jak to zrobić (i czy w ogóle jest to możliwe)?
Pomijam problem sprawdzania wersji i kopiowania plików.

wielkie dzięki za re cya

0

Nie dopisałem, że aplikacja po takim updacie musi być uruchomiona.

0

Zrobiłem własną aktualizację bazy więc podpowiem co i jak :)

Jeśli chcesz podmieniać plik, który właśnie uruchomiłeś to chyba jedyna możliwość to aktualizacja przez inny dodatkowy programik.

Ten mniejszy program jest wywoływany przez twój duży, a ma za zadanie pobranie malutkiego (rzędu 50 - 500 bajtów) pliku tekstowego np: update.ini, w którym jest numerek kolejnej wersji np: 30.
Program aktualizujący sprawdza informacje zawarte w tym pliku i porównuje z plikiem znajdującym się w folderze programu.
Jeśli w pliku na dysku jest 29 a w pobranym 30 to oznacza że jest nowsza wersja.
Programik aktualizujący pobiera nową wersję EXE, kiedy skończy zamyka główny EXE i podmienia, no i uruchamia ponownie - masz już nową wersję !

Jeśli w pliku na dysku jest 30 a w pobranym 30 to oznacza że użytkownik ma aktualną wersję.
Plik update.ini - zarządzasz informacjami w nim zawartymi na serwerze.

O pobieraniu masz w FAQ i przykładach... :)

0

Nie chodzi mi o sprawdzenie wersji.
Istotą sprawy jest to, aby program, który jest uruchomiony wywołał inny program, który nadpisze plik exe tego pierwszego nowszą wersją.

0

jest jeszcze inne rozwiązania, ale chyba trochę przekombinowane:

Program główny to tylko mała aplikacja, której jedyną funkcją jest ładowanie biblioteki DLL (ta jest główną applikacją). Podczas update'u odłączmy ją na chwile, po czym ponownie ładujemy.
Inaczej mówiąc nasz program to wtyczka...

0

Hi.

Znalazłem rozwiązanie - oto ono:

Aplikacja sprawdza że jest nowa wersja, kopiuje plik do swojego folderu a następnie

var
  start: TStartupInfo;
  procInfo: TProcessInformation;
begin

  FillChar(start, SizeOf(start), #0); //zerowanie struktur
  start.cb := SizeOf(start);

  if not CreateProcess(nil,'kopiuj.exe',  nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, start, procInfo) then
          MessageBox(0, 'Nie udało się uruchomić procesu.', 'KSKom Update', MB_OK);

  application.Terminate; //zamknięcie samej siebie

Plik 'kopiuj.exe' jest aplikacją api wyciąganą z zasobów. Oto jej treść:

program kopiuj;

uses
  Windows;

var
  start: TStartupInfo;
  procInfo: TProcessInformation;

begin
  sleep(2000);

  FillChar(start, SizeOf(start), #0);
  start.cb := SizeOf(start);

  DeleteFile(pchar('kskom.exe')); // usunięcie starej wersji
  MoveFile(pchar('kskom.new'),pchar('kskom.exe')); // zmiana nazwy wcześniej skopiowanego pliku

  // odpalenie procesiku
  if not CreateProcess(nil,'kskom.exe',  nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, start, procInfo) then
    MessageBox(0, 'Nie udało się uruchomić procesu.', 'KSKom', MB_OK);

end.

Na koniec należy jeszcze posprzątać - usuwając plik 'kopiuj.exe'

Pozdrawiam

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