Udostępnij przez


Korzystanie z informacji o wersji

Program instalacyjny zwykle ma następujące cele:

  • Aby umieścić pliki w odpowiedniej lokalizacji.
  • Aby powiadomić użytkownika, czy program instalacyjny zastępuje istniejący plik wersją, która jest znacznie inna — na przykład zastępując plik języka niemieckiego plikiem w języku angielskim lub zastępując nowszy plik starszym plikiem.

Podczas pisania programu instalacyjnego należy dysponować następującymi informacjami dla każdego pliku:

  • Nazwa i lokalizacja pliku (określane jako plik źródłowy).
  • Nazwa równoważnego pliku na dysku twardym użytkownika (nazywanym plikiem docelowym). Ta nazwa jest zwykle taka sama jak nazwa pliku na dysku instalacyjnym.
  • Stan udostępniania pliku — to znaczy, czy plik jest prywatny dla instalowanej aplikacji, czy może być współużytkowany przez wiele aplikacji.

Program instalacyjny może użyć funkcji VerFindFile, aby określić, gdzie plik ma zostać skopiowany na dysku. Tej funkcji można również użyć do określenia, czy plik jest prywatny dla aplikacji, czy może być udostępniony. Jeśli wystąpi problem podczas znajdowania pliku, VerFindFile zwraca wartość błędu. Jeśli na przykład system używa pliku docelowego, VerFindFile zwraca VFF_FILEINUSE. Program instalacyjny musi powiadomić użytkownika o problemie i odpowiedzieć na decyzję użytkownika o kontynuowaniu lub zakończeniu instalacji.

Funkcja VerInstallFile kopiuje plik źródłowy do pliku tymczasowego w katalogu określonym przez VerFindFile. W razie potrzeby VerInstallFile rozszerza plik przy użyciu funkcji w bibliotece dekompresji danych.

VerInstallFile porównuje informacje o wersji pliku tymczasowego z plikiem docelowym. Jeśli te dwie wartości są różne, VerInstallFile zwraca co najmniej jedną wartość błędu. Na przykład zwraca VIF_SRCOLD, jeśli plik tymczasowy jest starszy niż plik docelowy i VIF_DIFFLANG, jeśli pliki mają różne identyfikatory języka lub wartości strony kodowej. Program instalacyjny musi powiadomić użytkownika o problemie i odpowiedzieć na decyzję użytkownika o kontynuowaniu lub zakończeniu instalacji.

Niektóre błędy VerInstallFile można odzyskać. Oznacza to, że program instalacyjny może ponownie wywołać VerInstallFile, określając opcję VIFF_FORCEINSTALL, aby zainstalować plik niezależnie od konfliktu wersji. Jeśli VerInstallFile zwraca VIF_TEMPFILE, a użytkownik zdecyduje się nie wymusić instalacji, program instalacyjny powinien usunąć plik tymczasowy.

VerInstallFile może napotkać błąd nieodzyskiwalny podczas próby wymuszenia instalacji, mimo że błąd nie istniał wcześniej. Na przykład plik może zostać zablokowany przez innego użytkownika przed próbą wymuszenia instalacji programu instalacyjnego. Jeśli program instalacyjny próbuje wymusić instalację po błędzie niemożliwym do odzyskania, VerInstallFile zakończy się niepowodzeniem. Program instalacyjny musi zawierać procedury odzyskiwania po błędzie tego typu.

Zalecanym rozwiązaniem jest wyświetlenie okna dialogowego z przyciskami Install, Skipi Install All. (Innym rozwiązaniem jest okno dialogowe z przyciskami Tak, Tak do wszystkich, Pomińi Anuluj). Przycisk Zainstaluj wszystkie powinien uniemożliwić programowi instalacyjnemu monitowanie użytkownika o podobne błędy, włączając opcję VIFF_FORCEINSTALL we wszystkich kolejnych zastosowaniach funkcji VerInstallFile. W przypadku błędów nieodzyskiwalnych należy wyłączyć przyciski Install i Install All.

Aby wyświetlić użytkownikowi przydatny komunikat o błędzie, program instalacyjny zazwyczaj musi pobrać informacje z zasobów wersji plików powodujących konflikt. Istnieją cztery funkcje, których program instalacyjny może używać w tym celu:

GetFileVersionInfoSize zwraca rozmiar informacji o wersji. GetFileVersionInfo używa informacji pobranych przez GetFileVersionInfoSize w celu pobrania struktury zawierającej informacje o wersji. VerQueryValue pobiera określony element członkowski z tej struktury.

Jeśli na przykład VerInstallFile zwraca błąd VIF_DIFFTYPE, program instalacyjny powinien używać funkcji GetFileVersionInfoSize, GetFileVersionInfoi VerQueryValue na plikach tymczasowych i docelowych, aby uzyskać ogólny typ każdego pliku. Jeśli języki plików powodują konflikt, program instalacyjny powinien również użyć VerLanguageName, aby przetłumaczyć identyfikator języka binarnego na tekstową reprezentację języka. (Na przykład 0x040C tłumaczy się na ciąg "Francuski".

Jeśli VerInstallFile zwraca błąd pliku, taki jak VIF_ACCESSVIOLATION, program instalacyjny powinien użyć funkcji GetLastError, aby pobrać najnowszą wartość błędu. Program powinien przełożyć tę wartość na komunikat informacyjny, aby był wyświetlany użytkownikowi. Program nie może uzyskać kontroli między wywołaniami VerInstallFile i GetLastError.