Installieren mit INF-Dateien

Willemers Informatik-Ecke

Windows 95 und NT 4.0 verfügen mit den INF-Dateien über einen eigenen Installationsmechanismus. Eine INF-Datei kann mit einem einfachen Editor erstellt werden und über das Klicken mit der rechten Maustaste zum Installieren verwendet werden.

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=17
mein1.exe landet im WINDOWS und mein2.exe in WINDOWS\INF.

Jetzt mit Deinstallation

Während man sonst denkt, kaputtmachen ist leichter als Aufbauen, wird man nun anderes lernen. Um eine Deinstallation zu gewährleisten, muß man sich zunächst in der Registry anmelden.

Uninstall vorbereiten

Der Ablauf der Deinstallation erfolgt über die Registry.
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.

Die Datei mein.inf

[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.

Extra-Wurst für NT

Ergänzt werden muß das alles um die Besonderheit des NT. LEIDER wird unter NT ein kleines bißchen anders deinstalliert. Unter Windows 95 sorgt der Eintrag
RunDll32 setupx.dll,InstallHinfSection DefaultUninstall 132 %17%\MEIN.INF
dafü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.INF
Darum 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"

Die Registry

Die Registry-HKEYs

HKCRHKEY_CLASSES_ROOT Hier stehen die Extension-Zuordnungen zu den Programmen
HKCUHKEY_CURRENT_USER
HKLMHKEY_LOCAL_MACHINE Hier stehen die Uninstall-Skripte
HKUHKEY_USERS
HKCCHKEY_CURRENT_CONFIG
HKDDHKEY_DYN_DATA

Uninstall

Unter HKLM steht ein Schlüssel für jedes Produkt.
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"

Dialogabfrage des Zielverzeichnisses

HKCU,""SOFTWARE\Reg-Schl’ssel???""
HKCU,""SOFTWARE\Reg-Schl’ssel???"",InstallDir1,,""%49001%""

RunOnce

[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=AdvSetup
Daraufhin 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

Grenzen und Hinweise

Dialogbereitschaft

Die Dialogbereitschaft wird durch die Datei ADVPACK.DLL mit immerhin 79KB erreicht. Die Größe würde uns nicht weiter jucken, wenn sichergestellt wäre daß die Datei auf jedem Rechner vorliegt. Dies gilt bei Rechnern mit Microsoft Office oder Internet-Explorer. Bei anderen kann die Installation scheitern.

Will ich sie also in meiner Installation benutzen, muß ich sie erst installieren und selbst ausliefern. Inwieweit Microsoft das erlaubt, weiß ich nicht.

Löschen von Verzeichnissen

Leider löschen die INF-Dateien nicht die leeren Verzeichnisse.

Löschen von Dateien

Beim Deinstallieren sollte man bedenken, daß auch Dateien existieren könnten, die z. Zt. der Installation noch nicht da waren. Ein typisches Beispiel sind FTS- und GID-Dateien, die bei der Verwendung von HLP-Dateien entstehen.

LDID-Codes für Pfade in Windows

Die Zahlen, die in den DestinationDirs genannt werden, haben folgende Bedeutung:

AngabeBedeutungtypischer 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.

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);

Der inf_name muss mit dem kompletten Pfadnamen angegeben werden.

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