Installieren mit INF-Dateien |
Soll es unbedingt eine SETUP.EXE sein, braucht man lediglich ein Programm mit einem einzigen Systemaufruf zu schreiben. Dadurch kann man sich die fetten Installationsriesen schenken, die meist größer sind als die zu installierenden Programme.
Leider ist diese Art der Installation spätestens seit Windows Vista aber nicht mehr so einfach möglich. Als Alternative bieten sich freie Programme wie beispielsweise NSIS (nullsoft scriptable install system an.
Kopieren von Dateien
Die erste Aufgabe einer Installationsroutine ist das Kopieren von Dateien
an einen vorbestimmten Ort.
[Version]
Signature=$Chicago$
[DefaultInstall]
Copyfiles=User.Files
[User.Files]
mein1.exe
mein2.exe
[DestinationDirs]
User.Files=10
Mit diesem einfachen Skript werden die Dateien mein1.exe und mein2.exe in das
Verzeichnis C:\WINDOWS unter NT in das Verzeichnis C:\WINNT geschrieben. Das
Zielverzeichnis wird durch einen Nummerncode festgelegt.
Auch verschiedene Ziele sind leicht ansteuerbar, wie der nächste Skript zeigt.
[Version] Signature=$Chicago$ [DefaultInstall] Copyfiles=User.File.1,User.File.2 [User.File.1] mein1.exe [User.File.2] mein2.exe [DestinationDirs] User.File.1=10 User.File.2=17mein1.exe landet im WINDOWS und mein2.exe in WINDOWS\INF.
HKEY_LOCAL_MACHINE Software\Microsoft\Windows\CurrentVersion\Uninstall\Unter diesem Key gibt es DisplayName und UninstallString. Erster dient dazu, den Programmnamen für die Eintragung Einstellungen-Systemsteuerung-Software-Installieren/Deinstallieren zu definieren. Der Eintrag unter UninstallString wird aufgerufen, wenn das Programm deinstalliert werden soll.
Woher weiß die Registry, was wir bei der Installation auf die Platte geschoben haben? Ganz einfach: gar nicht! In der INF-Datei wird eine Uninstall-Sektion eingetragen. Damit zum Zeitpunkt der Deinstallation diese ausgeführt werden kann, wird sie in das Verzeichnis \WINDOWS\INF kopiert.
[Version] Signature=$Chicago$ [DefaultInstall] AddReg=User.Registry95 Copyfiles=User.Files,Inf.File Uninstall=DefaultUninstall [DefaultUninstall] DelReg=User.Registry95 DelFiles=User.Files,Inf.File [User.Registry95] HKLM,%Uninstall%%Product% HKLM,%Uninstall%%Product%,DisplayName,,"%Product%" HKLM,%Uninstall%%Product%,UninstallString,,"RunDll32 setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\MEIN.INF" [User.Files] mein1.exe mein2.exe [Inf.File] mein.inf [DestinationDirs] User.Files=10 Inf.File=17 [Strings] Product="Mein Programm" Uninstall="Software\Microsoft\Windows\CurrentVersion\Uninstall\"In DestinationDirs steht nun für Inf.File eine 17. Dies ist die Kennung des Installationsskriptes für das INF-Verzeichnis.
Eine weitere Neuerung findet sich in der Sektion Strings. Hier können wiederkehrende Strings einmal definiert werden und mehrfach verwendet werden.
RunDll32 setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\MEIN.INFdafür, die DefaultUninstall-Sektion von MEIN.INF anzusprechen, die von der Installation in das INF-Verzeichnis von Windows kopiert wurde. Unter Windows NT sieht der gleiche Eintrag so aus:
RunDll32 setupapi.dll,InstallHinfSection DefaultUninstall.ntx86 132 %17%\MEIN.INFDarum müssen leider zwei Install- und Deinstall-Sektionen geschrieben werden. Wenn eine DefaultInstall.ntx86 vorhanden ist, verwendet NT diese. Damit können wir den NT-Eintrag setzen.
[DefaultInstall.ntx86] AddReg=User.RegistryNT Copyfiles=User.Files,Inf.File Uninstall=DefaultUninstall.ntx86 [DefaultUninstall.ntx86] DelReg=User.RegistryNT DelFiles=User.Files,Inf.File [User.RegistryNT] HKLM,%Uninstall%%Product% HKLM,%Uninstall%%Product%,DisplayName,,"%Product%" HKLM,%Uninstall%%Product%,UninstallString,,"RunDll32 setupapi.dll,InstallHinfSection DefaultUninstall.ntx86 132 %17%\MEIN.INF"
HKCR | HKEY_CLASSES_ROOT | Hier stehen die Extension-Zuordnungen zu den Programmen |
HKCU | HKEY_CURRENT_USER | |
HKLM | HKEY_LOCAL_MACHINE | Hier stehen die Uninstall-Skripte |
HKU | HKEY_USERS | |
HKCC | HKEY_CURRENT_CONFIG | |
HKDD | HKEY_DYN_DATA |
Software\Microsoft\Windows\CurrentVersion\Uninstall\%Product%Als Unterschlüssel gibt es DisplayName. Der Wert dieses Schlüssels taucht in der Software-Einstellung auf. Er kann zur Deinstallation angewählt werden.
Der Unterschlüssel UninstallString enthält den Aufruf zur Deinstallation. Beispiel:
HKLM,%Uninstall%%Product% HKLM,%Uninstall%%Product%,DisplayName,,"%Product%" HKLM,%Uninstall%%Product%,UninstallString,,"RunDll32 setupapi.dll,InstallHinfSection DefaultUninstall.ntx86 132 %17%\MEIN.INF"
HKCU,""SOFTWARE\Reg-Schl’ssel???"" HKCU,""SOFTWARE\Reg-Schl’ssel???"",InstallDir1,,""%49001%""
[Strings] Runonce="SOFTWARE\Microsoft\Windows\CurrentVersion\Runonce\" [AdvSetup] HKLM,%RunOnce%Setup,"Kleiner...",,"RunDll32.exe %11%\AdvPack.Dll,LaunchINFSection KLEIN.INF,DefaultInstall2" [AdvSetup.ntx86] HKLM,%RunOnce%Setup,"Kleiner...",,"RunDll32.exe %11%\AdvPack.Dll,LaunchINFSection KLEIN.INF,DefaultInstall2.ntx86" [DefaultInstall] Ini2Reg=INFTool.AddINI AddReg=AdvSetupDaraufhin wird per RunDll32 aus dem AdvPack.DLL die DefaultInstall2 aus KLEIN.INF gestartet.
[DefaultInstall2] AddReg=INFTool.Add.Reg.95 CustomDestination=CustomDirs Copyfiles=DestGrp,DestGrp1,Add.Inf BeginPrompt=InstallBegin Uninstall=DefaultUninstall SmartReboot=N
Will ich sie also in meiner Installation benutzen, muß ich sie erst installieren und selbst ausliefern. Inwieweit Microsoft das erlaubt, weiß ich nicht.
Angabe | Bedeutung | typischer Pfad |
---|---|---|
0,<Zielpfad> | feste Zielangabe | |
01 | Source | D:\PATH |
10 | Windows-Verz. | C:\WINDOWS |
11 | System-Verz. | C:\WINDOWS\SYSTEM |
12 | IOSubSys-Verz. | C:\WINDOWS\SYSTEM\IOSUBSYS |
13 | Command | C:\WINDOWS\COMMAND |
17 | INF-Directory | C:\WINDOWS\INF |
18 | Help-Verz. | C:\WINDOWS\HELP |
19 | Administration | C:\WINDOWS |
20 | Fonts | C:\WINDOWS\FONTS |
21 | Viewers | C:\WINDOWS\SYSTEM\VIEWERS |
22 | VMM32 | C:\WINDWOS\SYSTEM\VMM32 |
23 | Color | C:\WINDWOS\SYSTEM\COLOR |
24 | scheint Root des Bootlaufwerkes zu sein. | |
25 | Shared | C:\WINDOWS |
26 | WindowsBoot | C:\WINDOWS |
28 | Host WindowsBoot | C:\WINDOWS |
30 | Root des Bootlaufwerkes | C:\ |
49001 | wird vom INF-Tool für Dialoge verwendet |
0,<Zielpfad> funktioniert nur unter Windows NT. Sollte es dort noch kein Verzeichnis geben, wird es automatisch erzeugt.
Der inf_name muss mit dem kompletten Pfadnamen angegeben werden.
Aufruf aus dem Programm
Um eine INF-Datei aus dem Programm heraus starten zu können,
verwendet man den Aufruf
ShellExecute(NULL, "install", inf_name, NULL, NULL, SW_SHOWNORMAL);
Automatischer Start beim Einlegen von CDs
Wird Wurzelverzeichnis einer CD die Datei autorun.inf gefunden,
wird ein Programm gestartet, das darin angegeben ist. Die Datei muss
dazu eine Sektion autorun besitzen. Hinter open= wird das
zu startende Programm genannt.
[autorun]
open=startup.exe
icon=cdimage.ico
Mit icon= kann festgelegt werden, welches Icon statt dem Standard-CD-Icon im Explorer
erscheinen soll. Die Datei muss im gleichen Verzeichnis stehen wie die Datei unter
open=.
Literatur
Link
Das Sharewareprogramm
INF-Tool
ermöglicht das bequeme Erzeugen von INF-Dateien.
Homepage - Windows-API-Programmierung | (C) Copyright 1999, 2000 Arnold Willemer |