AKInstaller      
Erste Schritte - Teil8: Benutzerdefinierte Aktionen, Teil 4 Eigene DLLs

 

Beim Einbinden eigener DLLs kommen wir zu diesem rechte einfach gehaltenen Dialog, der aber alles beinhaltet, was wir benötigen.

Der Bezeichner ist die ID und wird auch für die Ausgabe im Logfile verwendet. Die DLL muss, wie im vorherigen Artikel erwähnt, eine der nötigen Einstiegspunkte haben.

Wichtig ist für uns eigentlich die Datendatei. Hat die Erweiterung keine feste Aufgabe, sondern eine individuelle wie z. B. die Erweiterung NT-Dienste, werden hier die zu verarbeitenden Daten übergeben, in welcher Form auch immer.



Wie in der Struktur zusehen wird uns diese Datei mittels szDataFile geliefert. Außerdem eine szUnInstallFile welche wir selbst mit Daten beliefern.


Wie ist nur der normale Ablauf bei einer Erweiterung, die Install, Rollback und Uninstall abhandeln soll?

Für unser Beispiel nehmen wir an, wir möchten vor der Erstinstallation 1-5 Systemdateien retten und dieses bei einer Deinstallation wieder zurückkopieren. Achtung, dieses ist NUR als Beispiel gedacht.

Bei der Installation wird in der Funktion EXT_IProcess ermittelt ob und welche Daten geändert werden müssen. Dazu holen wir und mittels GetFileVersion die Version und vergleichen diese per CompareVersion. Hierbei stellen wir fest, es sind 5 Dateien die wir retten müssen.

Wir geben dem Setup zu verstehen, das wir 5 Installationsschritte benötigen und setzen in EXT_IProcess:

akiStruct->dwStepSizeI= MAKELONG(5, PROGRESS_WIDTH);

Diese Schritte spiegeln sich auf im Fortschrittsbalken wieder.

Welche Dateien wir ändern müssen könnten wir (einfach gehalten) als INI-Dateienwerte in der szUnInstallFile vermerken:

[Update]
File1=C:\Windows\Sytem32\Datei1.dll
File2=C:\Windows\Sytem32\Datei2.dll
In EXT_IExecute holen wir und die Anzahl der Schritte:

WORD wSteps = LOWORD(akiStruct->dwStepSizeI);

// Ordner in dem die zu rettenden Dateien liegen sollen erstellen...
// Fehler?
return ERROR_INSTALL_FAILURE;

for(WORD i = 1; i <= wSteps; i++)
   {
   // Datei aus INI holen
  sprintf(szString1, _T("File%ld"), i);
   // Alte Datei kopieren und durch Neue ersetzen, Backup-Pfad in INI-Datei schreiben
   // Fehler?
return ERROR_INSTALL_FAILURE;
   // wenn fehlerfrei ...
   akiStruct->;dwStepSizeR = MAKELONG(i , PROGRESS_WIDTH);

...


Im Fehlerfall wird in EXT_IRollbackPost folgendes gemacht:

WORD wSteps = LOWORD(akiStruct->dwStepSizeR);
for(WORD i = 1; i <= wSteps; i++)
   {
   // Datei aus INI holen
  sprintf(szString1, _T("File%ld"), i);
  // Systemdatei durch Backup-Datei ersetzen.

EXT_IRollbackPre benötigen wir in dem Falle nicht, da die Schritte schon ermittelt wurden und wir vor dem Rollback des Setups keine weiteren Aufgaben haben bzw. erledigen müssen.
Das gleiche Verfahren nutzen wir in einem Uninstall, darum macht es Sinn für die 'INI-Datei' den szUnInstallFile-Pfad zu nutzen.

In EXT_UProcess werden die Anzahl der Schritte ermittelt, also wie viele Backup-Dateien haben wir. EXT_UExecute erledigt dann das Wiederherstellen der Dateien.
Das Ganze war jetzt bewusst einfach gehalten, da es nur den Weg aufzeigen sollte wie mit Process, Execute und Rollback bzw. Uninstall zu verfahren ist.

Natürlich sollte man bei diesem Beispiel im Uninstall prüfen, ob die aktuelle Datei vielleicht eine höhere Versionsnummer hat als das Backup und ob die Backupdatei tatsächlich auch die ehemalige Systemdatei ist.

Man sollte die Daten bei INI-Dateien also verschlüsseln und Hashwerte der Dateien sichern, ebenfalls verschlüsselt oder man verpackt die Backups in ein gesichertes Zip.

Sichtbarer Fortschritt für den Benutzer:
Außerdem könnten wir Process weglassen, da das Kopieren von 5 Dateien wohl nicht länger dauert, als der Benutzer braucht um den Finger von der Maustaste zu lösen.

Anders sieht es z. B. bei der Erweiterung Windows Features aus, wo vorher ermittelt wird, welche der Feature die benötigt werden installiert werden müssen und welche Abhängigkeiten diese benötigen und den darauf folgenden Installationsschritten ggf. sogar mit dem Aufruf von Windows Update, was einige Zeit in Anspruch nehmen kann. Hier muss der Benutzer Feedback erhalten, das sind zum einen die Installationsschritte die den Fortschrittsbalken bewegen aber auch Aufrufe von SetDlgInfoText und SetDlgDataText.