Downloader - aktualizacja zasobow.

0

Witam,
Zeby zrobic aplikacje, ktora po wlaczeniu programu dzialala by jako AutoUpdater , musze zrobic mniej wiecej tak , ze :

  1. Program sprawdza czy jest nowa wersja programu
  2. Jak jest to sciaga plik do okreslonego katalogu
  3. "zasysa" z niego zasob i laduje do aktualnego pliku
  4. Usuwa stary , sciagniety plik.

Mniej wiecej tak to sie odbywa?
Moze ktos mnie nakierunkowac?

Dziekuje za porady.

1
Kask napisał(a)
  1. Program sprawdza czy jest nowa wersja programu
  2. Jak jest to sciaga plik do okreslonego katalogu

To się zgadza - program podczas uruchamiania sprawdza czy jest dostępna nowsza wersja od istniejącej i jeśli tak - albo prosi użytkownika o potwierdzenie aktualizacji, albo nie (to zależy np. od ustawień aplikacji); Jeśli użytkownik potwierdzi wykonanie aktualizacji lub jeśli zezwalają na to ustawienia następuje pobieranie składników z serwera; Zwykle podczas aktualizacji dostęp do programu jest zablokowany i taki status utrzymuje się aż do ukończenia update'u; Nie spotkałem się jeszcze z programem, który aktualizuje się niejawnie (w tle) - wyjątkiem jest NOD32, który w tle aktualizuje jedynie bazę sygnatur, ale nie całej aplikacji;

Kask napisał(a)
  1. "zasysa" z niego zasob i laduje do aktualnego pliku

Nie rozumiem co ma to zdanie znaczyć... Updater ma pobrać składniki z sieci i po poprawnym ukończeniu pobierania zamienić/zmodyfikować wszystkie pliki, które wymagają aktualizacji; Nie rozumiem co mają do tego zasoby; Chyba, że chodzi Ci o to, że wszelkie składniki są zawarte w jednym pliku i po jego pobraniu z serwera następuje wypakowanie ich do odpowiednich katalogów - jest to niby jakieś rozwiązanie, ale nie wiem czy ma jakikolwiek sens w Twoim projekcie;

Jeśli coś źle zrozumiałem to postaraj się nieco jaśniej opisać istotę problemu;

0

Dziękuję za odpowiedz.
Bo mianowicie chodzi mi o to , żeby w programie zaktualizowały się zasoby , danych plików na nowsze wersje o ile istnieją...
np mam w programie 3 zasoby (3 programy)
Jeden z nich wymaga aktualizacji , bo przy każdym odpaleniem aplikacji sprawdzane jest czy jest nowa wersja pliku, jeśeli tak , to jakoś aktualizuje program bez ponownego uruchamiania go, tak jakby podmienia stary zasób z nowym.
O to mi chodziło dokładniej.

Pozdrawiam

0

Po kiego ładować programy w zasoby? Nie widzę żadnego sensownego wytłumaczenia, poza jednym: - ma to na celu jakieś działania na szkodę użytkownika, zaś programista jest na tyle nieudolny że nie widzi innego sposobu ukrycia.

1
Kask napisał(a)

Bo mianowicie chodzi mi o to , żeby w programie zaktualizowały się zasoby , danych plików na nowsze wersje o ile istnieją...

Obawiam się, że nie wiesz co to są zasoby programu i dlatego nie możemy się dogadać; Otóż zasoby są to elementy umieszczone wewnątrz pliku wykonywalnego/biblioteki/wtf jak np.: łańcuchy, czcionki, kursory, pliki graficzne, dźwięki czy dowolne inne pliki jako typ RT_RCDATA; Elementy te można załadować z wnętrza pliku do pamięci przez odpowiednie do tego celu funkcje WinAPI lub np. strumienie klasy TResourceStream; Poczytaj może więcej na temat zasobów programu;

Kask napisał(a)

np mam w programie 3 zasoby (3 programy)

Czyli w jednym pliku wykonywalnym/bibliotece masz "schowane" trzy pliki wykonywalne pakietu czy jak..? Jeśli faktycznie tak masz to jest dość kontrowersyjne, bo nie rozumiem po co chować je wewnątrz głównego pliku wykonywalnego; Nie możesz mieć modułów programu w osobnych plikach zapisanych bezpośrednio na dysku, a nie w zasobach innego tak, jak ma to miejsce np. w programie Glary Utilities? Ten program ma wiele modułów, jednak każdy moduł jest osobną aplikacją uruchamianą z głównej formy po wybraniu odpowiedniej pozycji, dzięki temu działają niezależnie od siebie; Nie potrzeba wtedy kombinować z wypakowywaniem odpowiedniego modułu z zasobów;

Kask napisał(a)

Jeden z nich wymaga aktualizacji , bo przy każdym odpaleniem aplikacji sprawdzane jest czy jest nowa wersja pliku, jeśeli tak , to jakoś aktualizuje program bez ponownego uruchamiania go, tak jakby podmienia stary zasób z nowym.

Jeśli jeden z zasobów wymaga aktualizacji, to zamienia się cały plik bez zbędnego kombinowania; Pakiet aktualizacyjny powinien mieć zawsze najnowsze wersje wszystkich składników, dzięki czemu aby zaktualizować wszystkie zasoby danego pliku projektu wystarczy po prostu zamienić stary plik na nowy;

Poza tym nie można legalnie i bezpiecznie edytować zawartości pliku wykonywalnego, podczas gdy aplikacja jest uruchomiona - plik wykonywalny aplikacji jest blokowany przez system i nie ma możliwości go edytować, więc Twój sposób na niejawną aktualizację zasobów nie powiedzie się; To nie jest najlepszy pomysł - każda aplikacja jaką znam nie zaktualizuje się bez co najmniej restartu, już nie mówiąc o całkowitym wyłaczeniu programu na czas podmiany starych plików; Niektóre programy wyłączają się już przed rozpoczęciem pobierania plików z serwera, niektóre tuż po ich pobraniu na dysk (jak choćby Opera, którą często aktualizuje) a przed ich podmianą;

Niektóre programy jak wyżej wspomniany Glary Utilities czy Defraggler nie oferują automatycznej aktualizacji, więc trzeba ręcznie pobrać nowy instalator programu i przeinstalować cały program - opcja najbezpieczniejsza i najmniej przy niej jest roboty - wystarczy sprawdzić, czy dostępna jest nowa wersja i jeśli jest - otworzyć przeglądarkę z załadowaną stroną, z której można pobrać nowy pakiet instalacyjny; Aby wykryć czy aplikacja aktualizowana jest otwarta i zabezpieczyć się przed konfliktem edycji/podmiany zablokowanego pliku wykonywalnego można posłużyć się Mutex'em;

Jeśli chodzi o aktualizację niektórych składników programu, które nie są zaimplementowane wewnątrz pliku wykonywalnego programu to można program zaktualizować bez jego restartu, ale trzeba pamiętać o uwzględnieniu obsługi wprowadzonych zmian w plikach;

Reasumując jeśli dobrze zrozumiałem o co Tobie chodzi to musze stwierdzić, że niepotrzebnie kombinujesz, dokładasz sobie roboty przez dziwaczne i niestandardowe rozwiązania; Jeśli ja miałbym zrobić aktualizację własnego programu (gdzie aktualizacji zostanie poddany główny plik wykonywalny programu) to brałbym pod uwagę następujące metody:

  • aktualizacja przez ręczne przeinstalowanie programu - poinformować użytkownika o nowej wersji programu i po zaakceptowaniu komunikatu skierować go na stronę, z której może porać nowy instalator,
  • aktualizacja automatyczna - po wykryciu nowej wersji i potwierdzeniu komunikatu przez użytkownika aplikacja zostaje zablokowana/wyłączona, zostają pobrane nowe wersje plików programu i automatycznie podmienione, po czym aplikacja zostaje zrestartowana/włączona;
    Powiadamianie użytkownika o nowej aktualizacji zwykle uzależnione jest od ustawień programu; IMHO inne opcje wydają się być przekombinowane;
0

Dziękuję Furious Programming za bardzo długą i bardzo interesującą wypowiedz. Zrobię w takim razie tak jak napisaleś , czyli jak wyjdzie nowa wersja programu to będzie informować o tym użytkownika, jeżeli zaakceptuje to ściągnie się nowa wersja programu.
Temat do zamknięcia.

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