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;