# 30 Weitergabe von Anwendungen In diesem Kapitel erfahren Sie, wie Sie Ihre Anwendungen zur lokalen Installation oder zur Bereitstellung via ClickOnce auf einem Webserver weitergeben können. ## 30.1 Weitergabe mit MS-Installer Im Grunde genommen ist es ganz einfach, ein .NET-Programm zu installieren. Sie brauchen nur die Programmdatei (EXE-Datei) und die möglicherweise dazugehörigen Bibliotheken (DLL-Dateien) in das gewünschte Zielverzeichnis zu kopieren. Das ist bereits alles. Der aus DOS-Zeiten bekannte Befehl Xcopy reicht dazu völlig aus, da von einer .NET-Anwendung in der Regel weder Einträge in der Registrierungsdatenbank vorgenommen werden noch eine Manipulation der Systemdateien von Windows erfolgt. Gegen dieses einfache Verfahren, so vorteilhaft es im ersten Augenblick auch erscheinen mag, spricht zumindest das Anspruchsdenken der Benutzer, die es gewohnt sind, grafisch durch ein Installationsprogramm geführt zu werden. Darüber hinaus bietet eine übliche Installationsroutine aber noch einige Vorzüge, die sich erst beim zweiten Hinsehen offenbaren. So werden installierte Programme in das Startmenü eingetragen, und viele legen darüber hinaus noch ein Symbol auf dem Desktop ab. Das ist sehr komfortabel, nimmt es doch den Anwendern einige zusätzliche Arbeit ab. Allein diese Punkte sprechen schon dafür, ein Programm zusammen mit einer benutzerfreundlichen Installationsroutine auszuliefern. Aber auch aus Sicht des Anwendungsentwicklers lassen sich Argumente für eine Installationsroutine finden. Vielleicht soll das Programm ein eigenes Dateiformat registrieren, oder die Eingabe einer Seriennummer soll die unerlaubte Weitergabe der Anwendung weitestgehend erschweren; möglicherweise soll sich der Benutzer auch mit Lizenzbedingungen einverstanden erklären. Diese Dinge werden durch eine einfache Xcopy-Installation natürlich nicht abgedeckt. Visual Studio 2010 unterstützt die Weitergabe von Programmen durch einen eigenen Projekttyp, der im Projektauswahldialog unter dem Knoten Setup und Bereitstellung zu finden ist. Die Möglichkeiten, die mit den einzelnen Projekttypen abgedeckt werden, sind sehr vielseitig, und es bleiben nur noch wenige Wünsche offen. ### 30.1.1 Weitergabeprojekte In Visual Studio 2010 stehen Ihnen fünf verschiedene Weitergabeprojekttypen zur Verfügung: Setup-Projekt Websetup-Projekt Merge-Modulprojekt CAB-Projekt CAB-Projekt für intelligente Geräte Ergänzt werden diese um einen Setup-Assistenten, der die schrittweise Erstellung eines Weitergabeprojekts unterstützt, aber bei Weitem nicht die Fähigkeiten der anderen Projekttypen aufweist. Allerdings kann ein mit dem Assistent erstelltes Weitergabeprojekt auch nachträglich noch an die Anforderungen angepasst werden. #### Websetup-Projekt und Setup-Projekt Diese beiden Typen unterscheiden sich darin, wo das Installationsprogramm die zu installierenden Dateien bereitstellt. Bei einem Setup-Projekt ist es das Dateisystem auf einem Rechner, bei einem Websetup-Projekt ein virtuelles Verzeichnis auf einem Webserver. Bei den Dateien, die bei der Kompilierung des Projekts erzeugt werden, handelt es sich im Wesentlichen nur um setup.exe und eine Datei mit der Dateierweiterung .MSI. Die Datei setup.exe hat die Aufgabe, zu überprüfen, ob auf dem Zielrechner der Windows Installer installiert ist. Ist das Ergebnis der Prüfung negativ, wird in Abhängigkeit vom Betriebssystem entweder die Datei InstMsiW.exe oder die Datei InstMsiW.exe installiert. Erst danach kann die MSI-Datei installiert werden, die alle Dateien und Informationen zum Installationsprozess enthält. #### Merge-Modulprojekte Ein Merge-Modulprojekt ist kein Setup-Projekt im eigentlichen Sinne und kann daher auch nicht eigenständig installiert werden. Ein Merge-Modul wird in andere Weitergabeprojekte integriert und erleichtert damit nur das Erstellen mehrerer Installationsprogramme, die identische Komponenten beinhalten. Merge-Module lassen sich daher besser mit DLL-Dateien vergleichen, denen eine ähnliche Aufgabe zukommt. #### CAB-Projekte CAB-Dateien beinhalten komprimierte Dateien, die zu einem leicht zu verteilenden Paket zusammengeschnürt werden. Eine CAB-Datei kann wie ein Merge-Modul in anderen Projekten verwendet werden, eignet sich aber auch zur Weitergabe von Dateien über das Internet.
Anmerkung
Wir werden uns in diesem Kapitel nur mit dem Setup-Projekt beschäftigen. Wenn Sie sich auch für die anderen Projekttypen interessieren, finden Sie in der Online-Hilfe weitergehende Informationen.
### 30.1.2 Der Windows Installer Die Weitergabeprojekte in Visual Studio 2010 basieren auf dem Microsoft Windows Installer. Der Windows Installer ist ein Dienst und gilt somit als Betriebssystemerweiterung. Er ist nicht .NET-spezifisch und hat die Aufgabe, die Installation und Deinstallation zu verwalten. Seit Windows 2000 gehört dieser Dienst zum Lieferumfang der Microsoft-Betriebssysteme, er kann aber unter Windows 95, Windows 98 und Windows NT 4.0 auch nachträglich installiert werden. Die Installationsdatei eines Windows Installer-Weitergabeprojekts hat die Endung MSI. Alle Dateien, die zu dem Weitergabeprojekt gehören, befinden sich in komprimierter Form in dieser Datei. Eine Programminstallation kann bereits durch einen Doppelklick auf die MSI-Datei im Windows Explorer gestartet werden. Üblicherweise gesellt sich aber zur Installationsdatei auch noch eine Datei namens setup.exe, die die Aufgabe hat, zu überprüfen, ob auf dem Zielcomputer der Windows Installer bereits installiert ist. Ist er nicht installiert, wird im gleichen Verzeichnis nach einer Datei namens InstMsiA.exe bzw. InstMsiW.exe gesucht, und anschließend wird diese ausgeführt. Welche von den beiden Dateien das ist, hängt vom Betriebssystem ab. Das Problem, auf einen Rechner zu stoßen, auf dem der Windows Installer noch nicht installiert ist, dürften Sie aber nie haben. Denn spätestens mit der Installation des .NET Frameworks wird auch gleichzeitig der Windows Installer bereitgestellt. ### 30.1.3 Weitergabeprojekte mit dem Setup-Assistenten Bevor Sie ein Projekt in einem Installationsprogramm zur Weitergabe verpacken, sollten Sie eine Release-Version des Projekts kompilieren. Die Umschaltung dazu erfolgt in der Symbolleiste der Entwicklungsumgebung. Sie können ein Weitergabeprojekt natürlich auch in einer separaten Instanz von Visual Studio 2010 erstellen. Es erleichtert aber die Einbindung der zu verteilenden Dateien, wenn Sie das Projekt, das Sie weitergeben wollen, zuerst in die Entwicklungsumgebung laden und anschließend der Projektmappe ein weiteres Projekt vom Typ Setup-Assistent hinzufügen. Den vorgeschlagenen Projektbezeichner sollten Sie allerdings durch einen aussagekräftigeren ersetzen, da der Bezeichner bei der Installation des Programms in der Titelleiste der Installationsdialoge angezeigt wird und auch als Dateiname der MSI-Datei dient. Nach dem Bestätigen des Dialogs Neues Projekt öffnet sich zuerst ein allgemeiner Begrüßungsdialog. Im darauf folgenden Dialogfenster werden die verschiedenen Projekttypen angeboten (siehe Abbildung 30.1). Die Vorgabe, ein Setup für eine Windows-Anwendung zu erstellen, kann man meist übernehmen. Hier klicken, um das Bild zu vergrößern Abbildung 30.1 Zweite Dialogseite des Setup-Assistenten Im dritten Schritt werden die Dateien angegeben, die in den Verteilungsprozess mit einbezogen werden sollen. Hier müssen Sie zumindest die zum Projekt gehörenden EXE-Dateien angeben, möglicherweise auch die Ressourcen- und die etwaige Anwendungskonfigurationsdatei (siehe Abbildung 30.2). DLL-Dateien, auf die innerhalb des Projekts verwiesen wird, werden automatisch in die Setup-Routine mit eingebunden. Nach dem Beenden des Assistenten wird in der Entwicklungsumgebung ein neues Fenster geöffnet (siehe Abbildung 30.3). Hier können Sie Ergänzungen und Änderungen vornehmen, um beispielsweise festzulegen, dass nach der Installation der Anwendung auf dem Desktop des Benutzers ein Symbol angezeigt wird oder ein Eintrag in das Startmenü von Windows erfolgt. Die Möglichkeiten sind sehr umfangreich und auf den ersten Blick nicht sofort zu erkennen. Wir werden darauf in den folgenden Abschnitten dieses Kapitels noch zu sprechen kommen. Dieses Fenster wird übrigens auch geöffnet, wenn Sie als Vorlage des Weitergabeprojekts nicht den Setup-Assistenten, sondern Setup-Projekt auswählen. Auch hier müssen Sie die zu verteilenden Dateien auswählen, die in die Setup-Routine eingebunden werden sollen. Da der Setup-Assistent Ihnen allerdings kaum etwas von der notwendigen Arbeit abnimmt und normalerweise auch noch erheblicher Nacharbeit bedarf, muss man sich die Frage nach dem Sinn dieser Projektvorlage stellen. Der Setup-Assistent wird seinem Namen nicht gerecht und kann kaum als hilfreich angesehen werden. Hier klicken, um das Bild zu vergrößern Abbildung 30.2 Auswahldialog für die zu verteilenden Dateien Hier klicken, um das Bild zu vergrößern Abbildung 30.3 Fenster nach dem Fertigstellen des Setup-Assistenten #### Kompilieren des Weitergabeprojekts Sind alle Einstellungen vorgenommen, einschließlich der, die wir noch erörtern werden, muss das Projekt nur noch kompiliert werden. Die vorgenommenen Einstellungen werden in einer Datei mit der Erweiterung VDPROJ gespeichert. Dabei handelt es sich um eine reine Textdatei, die allerdings nicht verändert werden sollte. Vorausgesetzt, die Release-Konfiguration wurde eingestellt, befinden sich die zu verteilenden Dateien im Unterordner Release des Setup-Projekts. Es handelt sich dabei um die Datei setup.exe, mit der die Installation gestartet wird, sowie um eine MSI-Datei mit den komprimierten Dateien des Projekts.
Hinweis
Wenn Sie ein Weitergabeprojekt testen wollen, müssen Sie nicht immer wieder zwischen dem Windows Explorer und dem Dialog Software der Systemsteuerung wechseln. Einfacher ist es, die Anwendung aus der Entwicklungsumgebung von Visual Studio 2010 heraus sowohl zu installieren als auch zu deinstallieren. Dazu müssen Sie nur das Kontextmenü des Weitergabeprojekts öffnen und den Menüeintrag Installieren oder Deinstallieren auswählen.
### 30.1.4 Editoren eines Weitergabeprojekts Ein Weitergabeprojekt, das mit dem Setup-Assistenten erstellt und nicht weiter bearbeitet worden ist, genügt kaum den minimalen Anforderungen einer geführten Installation. Der Benutzer wird willkommen geheißen, es wird ihm ein Vorschlag unterbreitet, in welchem Ordner das zu installierende Programm gespeichert wird (was der Anwender nach eigenem Ermessen auch noch ändern kann), der Fortschritt der Installation wird durch einen Fortschrittsbalken angezeigt, und am Ende wird die hoffentlich erfolgreiche Installation gemeldet. Ein Installationsprogramm lässt aber noch viele weitere Möglichkeiten der Konfiguration zu. Beispielsweise können zusätzliche Ordner auf dem Zielrechner angelegt werden, es lassen sich Bedingungen zur Installation bestimmter Dateien festlegen, die Standardinstallationsroutine kann durch weitere Dialogfenster erweitert werden, in denen beispielsweise eine Seriennummer eingetragen werden muss, bestimmte Dateitypen können registriert werden usw. Der Ausgangspunkt aller Konfigurationen sind die Weitergabeeditoren, die über die Symbolleiste im Projektmappen-Explorer des Weitergabeprojekts geöffnet werden können. Hier klicken, um das Bild zu vergrößern Abbildung 30.4 Symbolleiste eines Weitergabeprojekts im Projektmappen-Explorer Es ist zunächst einmal sinnvoll, sich mit den verschiedenen Aufgaben der Editoren vertraut zu machen. Daher folgt nun zuerst eine Kurzbeschreibung, später werden wir noch etwas mehr ins Detail gehen. Da die Möglichkeiten der Einflussnahme auf den Installationsprozess sehr groß und vielschichtig sind, können wir uns im Rahmen dieses Buches nicht mit allen Gesichtspunkten beschäftigen. Von links nach rechts (siehe Abbildung 30.4) werden in der Symbolleiste die folgenden Editoren angeboten: Dateisystem-Editor: In diesem Editor werden die weiterzugebenden Dateien angegeben sowie die Ordner auf dem Zielrechner, in denen die Dateien installiert werden. Registrierungs-Editor: In diesem Editor lassen sich Registrierungsschlüssel und Registrierungswerte angeben, die in der Registrierungsdatenbank auf dem Zielrechner eingetragen werden. Schon beim ersten Start nach einer erfolgreichen Installation kann ein Programm direkt gültige Werte abfragen. Dateityp-Editor: Mit dem Dateityp-Editor können Dateizuordnungen auf dem Zielcomputer eingerichtet werden, die eine bestimmte Dateierweiterung mit der Anwendung verknüpfen. Darüber hinaus werden die für den Dateityp zulässigen Aktionen festgelegt. Benutzeroberflächen-Editor: Mit diesem Editor können Sie zusätzliche Dialoge bestimmen, die während des Installationsvorgangs angezeigt werden. Dieser Editor bietet die größte Einflussnahme auf den Installationsprozess. Editor für benutzerdefinierte Aktionen: Hiermit lassen sich benutzerdefinierte Aktionen definieren, die während der Installationsphase auf dem Zielrechner ausgeführt werden. Damit können beispielsweise Operationen festgelegt werden, die nur dann ausgeführt werden, wenn während der Installation ein Fehler auftritt oder wenn die Anwendung später deinstalliert werden soll. Editor für Startbedingungen: Die Lauffähigkeit mancher Anwendungen ist davon abhängig, dass bestimmte Dateien auf dem Zielcomputer installiert sind. Deren Existenz muss daher vor dem Beginn des eigentlichen Installationsprozesses geprüft werden. Ist das Suchergebnis negativ, lassen sich mit diesem Editor Aktionen festlegen, um die erforderlichen Dateien vor Beginn der Programminstallation zu installieren. Ein ganz typischer Fall ist, dass die Lauffähigkeit eines .NET-Programms von der Installation des .NET Frameworks abhängt. Ist das Framework noch nicht installiert, muss der Benutzer das noch nachholen. Eigenschaften: Dieses ganz links stehende Symbol im Projektmappen-Explorer öffnet keinen Editor, sondern ein Dialogfenster, in dem sich allgemeine Verteilungsbedingungen festlegen lassen.
Hinweis
Alle aufgeführten Editoren stehen gleichermaßen sowohl für ein Weitergabeprojekt, das mit dem Setup-Assistenten gestartet wird, als auch für ein Weitergabeprojekt vom Typ Setup-Projekt zur Verfügung.
### 30.1.5 Der Dateisystem-Editor Der Dateisystem-Editor wird nach dem Beenden des Setup-Assistenten angezeigt oder direkt, wenn ein neues Setup-Projekt angelegt wird. Der Editor dient als Container aller Dateien und Verknüpfungen, die auf dem Zielrechner installiert beziehungsweise eingerichtet werden müssen. Darüber hinaus enthält er auch alle Dateien, die vom Installationsprogramm benötigt werden, beispielsweise die Symboldateien. Kennzeichnend für den Dateisystem-Editor ist der zweigeteilte Anzeigebereich. Im linken Teilfenster sind Ordner aufgelistet. Diese entsprechen den Standardordnern von Windows, von denen drei sofort angegeben werden: Anwendungsordner Desktop des Benutzers Programmmenü des Benutzers Wenn Sie das Kontextmenü des übergeordneten Knotens Dateisystem auf Zielordner öffnen, werden noch viele zusätzliche Ordner angeboten, z. B. Windows-Ordner, System-Ordner oder Cacheordner für globale Assembly. Wenn Sie wollen, können Sie sogar eigene Ordner definieren, sodass Ihnen keine Grenzen gesetzt sind. Wenn Sie einen Ordnerknoten markieren, werden im Eigenschaftsfenster dessen Eigenschaften angezeigt. Tabelle 30.1 listet die wichtigsten Eigenschaften auf.

Tabelle 30.1 Eigenschaften eines Dateisystemordners

Eigenschaft | Beschreibung
AlwaysCreate | Mit dieser Eigenschaft wird ein boolescher Wert festgelegt, der dem Installationsprozess mitteilt, dass ein Ordner anzulegen ist. Ist der Wert true, wird der Ordner auch dann angelegt, wenn er keine Dateien enthält.
Condition | Mit dieser Eigenschaft wird eine bestimmte Bedingung festgelegt, die erfüllt sein muss, damit das Element, in diesem Fall der Ordner, installiert wird.
DefaultLocation | Diese Eigenschaft beschreibt den Standardspeicherort, an dem ein Ordner auf dem Zielcomputer installiert wird. Der Wert kann beliebig verändert werden.
Transitive | Diese Eigenschaft legt fest, wie die Eigenschaft Condition des Elements ausgewertet wird. Ist Transitive=true gesetzt, wird bei jeder Installation der Anwendung die Condition-Eigenschaft ausgewertet, andernfalls nur bei der ersten Installation.
Wenn wir uns den Eintrag der Eigenschaft DefaultLocation ansehen, finden wir folgende Angabe:
    [ProgramFilesFolder][Manufacturer]\[ProductName]
Ist der eingetragene Firmenname »Tollsoft« und der Produktname »MyFirstApp«, werden üblicherweise alle Dateien, die diesem Ordner zugeordnet sind, unter C:\Programme\Tollsoft\MyFirstApp gespeichert. Als Produktname wird der Bezeichner des Setup-Projekts übernommen. Sie können sowohl den Produktnamen als auch den Firmenbezeichner, der von der Installation des Visual Studio 2010 übernommen wird, beliebig einstellen. Markieren Sie dazu im Projektmappen-Explorer der Entwicklungsumgebung den Knoten des Setup-Projekts, und öffnen Sie dessen Eigenschaftsfenster. Hier stellen Sie die Eigenschaft Manufacturer und ProductName wie gewünscht ein.
Hinweis
Die meisten anderen Eigenschaftseinstellungen des Setup-Projekts werden ausgewertet, wenn im Windows-Explorer der Dialog Eigenschaften der MSI-Datei geöffnet wird. Weitere Informationen entnehmen Sie bitte der .NET-Dokumentation.
Der Speicherort für die Anwendungsdateien, der während der Installation vorgeschlagen wird, kann beliebig unter DefaultLocation eingestellt werden. Beispielsweise wird das Installationsprogramm mit der Voreinstellung
    [ProgramFilesFolder]\[ProductName]
den Vorschlag machen, die Anwendung in einem Verzeichnis zu installieren, das dem Namen des Produkts entspricht und dem Verzeichnis Programme direkt untergeordnet ist. Sie können sogar einen x-beliebigen Verzeichnisnamen vorschlagen, der keine Entsprechung durch ein Attribut finden, zum Beispiel:
    [ProgramFilesFolder]\HierhinInstallieren
ProgramFilesFolder, ProductName und Manufacturer sind Eigenschaften des Windows Installers, von denen der Installer eine unüberschaubar große Menge für die unterschiedlichsten Zwecke anbietet. Hier alle aufzuführen, würde viele Seiten des Buchs in Anspruch nehmen. Wenn Sie weitere Informationen benötigen, finden Sie diese in der MSDN-Library unter dem Stichwort Windows Installer unter Properties. Nichtsdestotrotz werden in Tabelle 30.2 die im Zusammenhang mit der Dateiinstallation wichtigsten Eigenschaften aufgeführt, um Ihnen zumindest in diesem Punkt die Arbeit etwas zu erleichtern.

Tabelle 30.2 Eigenschaften des Windows Installers, die Pfadinformationen liefern

Eigenschaft | Beschreibung
AppDataFolder | Liefert den Pfad zum Verzeichnis Anwendungsdaten des aktuellen Benutzers.
CommonAppDataFolder | Liefert den Pfad zum Verzeichnis Anwendungsdaten für alle Benutzer.
CommonFilesFolder | Liefert den Pfad zum Verzeichnis \Programme\Gemeinsame Dateien des aktuellen Benutzers.
DesktopFolder | Liefert den Pfad zum Desktop-Verzeichnis.
FavoritesFolder | Liefert den Pfad zum Verzeichnis Favoriten des aktuellen Benutzers.
MyPicturesFolder | Liefert den Pfad zum Verzeichnis Eigene Bilder des aktuellen Benutzers.
ProgramFilesFolder | Liefert den Pfad zum Verzeichnis Programme.
SendToFolder | Liefert den Pfad zum Verzeichnis SendTo des aktuellen Benutzers.
StartMenuFolder | Liefert den Pfad zum Verzeichnis Startmenü des aktuellen Benutzers.
SystemFolder | Liefert den Pfad zum Verzeichnis Sytem32.
TempFolder | Liefert den Pfad zum Verzeichnis Temp.
TemplateFolder | Liefert den Pfad zum Verzeichnis Vorlagen des aktuellen Benutzers.
WindowsFolder | Liefert den Pfad zum Verzeichnis Winnt.
#### Hinzufügen von Dateien Haben Sie den Setup-Assistenten benutzt, brauchen Sie sich eigentlich nicht weiter um das Hinzufügen der zu installierenden Dateien zu kümmern. Ihnen ist zumindest ein Teil der Arbeit abgenommen worden. Sollten Sie sich allerdings für Setup-Projekt entschieden haben, steht jetzt die wichtige Aufgabe an, alle notwendigen Dateien einzubinden. Markieren Sie dazu im Dateisystem-Editor den Eintrag Anwendungsordner, und öffnen Sie das dazugehörige Kontextmenü. Unter dem Menüpunkt Hinzufügen werden in einem Untermenü Ordner, Projektausgabe, Datei und Assembly angeboten. Wählen Sie aus der Liste Datei aus, und navigieren Sie anschließend im Auswahldialog zu der EXE-Datei der Anwendung. Die Entwicklungsumgebung fügt nicht nur die ausgewählte Programmdatei in das Weitergabeprojekt ein, sondern erkennt darüber hinaus auch alle Abhängigkeiten, sowohl die Abhängigkeit vom .NET Framework als auch die Abhängigkeit von benutzerdefinierten Bibliotheken (DLL-Dateien), die automatisch in das Projekt einbezogen werden. #### Dateien, auf die mit Programmcode zugegriffen wird Ausgesprochen problematisch ist es, im Programmcode eine Pfadangabe zu machen, die sich auf das lokale Dateisystem des Entwicklungsrechners bezieht. Dabei kann es sich um Bilder, eine Datenbankdatei oder auch um ganz einfache Datendateien handeln. Angenommen, zur Laufzeit einer Anwendung soll in einer Picturebox eine Bitmap angezeigt werden. Die Anweisung zum Laden der Bitmap könnte wie folgt codiert sein:
    pictureBox1.Image = Image.FromFile(@"C:\Bitmap1.bmp");
Beim Testen der Anwendung wird die Anweisung keinen Fehler verursachen – vorausgesetzt natürlich, dass die Grafikdatei auch unter der codierten Pfadangabe zu finden ist. Nach der Installation der Anwendung auf dem Zielcomputer ist die Wahrscheinlichkeit aber gering, dass die Anweisung unter der Pfadangabe eine Datei mit diesem Namen finden wird. Die Folge ist ein Laufzeitfehler. Wenn Sie davon ausgehen müssen, dass eine bestimmte Datei nicht auf dem Zielrechner in einem bestimmten Verzeichnis vorgefunden wird, müssen Sie die Datei in die Installationsroutine mit aufnehmen. Dazu eignet sich grundsätzlich jedes Verzeichnis, das auf dem Zielrechner identifiziert werden kann. Möchten Sie die Datei im Anwendungsordner verteilen, fügen Sie die Datei dem gleichnamigen Knoten im Dateisystem-Editor hinzu. Die Anweisung im Programmcode muss dann wie folgt lauten:
    pictureBox1.Image = Image.FromFile(@"Bitmap1.bmp");
#### Weitere Unterordner hinzufügen Häufig werden zusätzliche Dateien auch in einem Unterordner des Programmordners abgelegt. Einen Unterordner anzulegen ist nicht schwierig. Markieren Sie dazu im Dateisystem-Editor nur den Ordner, der den Unterordner enthalten soll, und wählen Sie im Kontextmenü Hinzufügen und dann Ordner aus. Anschließend müssen Sie nur noch einen aussagekräftigen Namen finden. Hier klicken, um das Bild zu vergrößern Abbildung 30.5 Unterordner des Anwendungsordners Unabhängig davon, ob von der Anwendung benötigte Dateien im Anwendungsverzeichnis oder in einem Unterverzeichnis von diesem installiert werden, müssen Sie das Verzeichnis in der Anweisung berücksichtigen, die auf die Datei zugreift. Damit stehen Sie aber auch vor einem entwicklungstechnischen Problem: Entweder Sie kopieren die Dateien auf dem Entwicklungsrechner in einen Pfad, der dem relativen Pfad auf dem Zielrechner entspricht, oder Sie passen alle Pfadangaben vor der endgültigen Kompilierung an die relativen Pfade der auf dem Zielrechner installierten Anwendung an. Sie können sich Ärger und zumindest einen weiteren ausgiebigen Testlauf ersparen, wenn Sie bei der Entwicklung der Anwendung dieser Situation von Anfang an Rechnung tragen. Dazu bietet es sich an, ein benutzerdefiniertes Attribut bereitzustellen, das den Pfad zu den Ressourcen beschreibt. Angenommen, Sie beabsichtigen, mit einer Anwendung Grafiken weiterzugeben. Während der Entwicklungsphase sei dieser Ordner ein Unterordner des Projektverzeichnisses. Wahrscheinlich werden Sie zu diesem Zeitpunkt auch noch keinen Gedanken daran verschwenden, in welchem Verzeichnis auf dem Zielrechner später die Grafikdateien zu finden sind bzw. wie der Ordner heißen wird. Im benutzerdefinierten Attribut wird eine öffentliche Variable deklariert, die den Zugriffspfad zu dem Ordner der Grafikdateien beschreibt. Dabei gibt man am besten einen relativen Pfad bezogen auf die Programmdatei an. Das Attribut könnte dann gemäß der oben beschriebenen Annahme wie folgt definiert sein:
    [AttributeUsage(AttributeTargets.All)]
    public class BitmapLocationAttribute : Attribute {
       public string Loacation = "..\\..\\..\\Bilder\\";
    }
Eine Form, aus deren Programmcode heraus auf eine Grafik im Ordner Bilder zugegriffen wird, muss mit dem Attribut BitmapLocationAttribute verknüpft werden. Sie müssen sich anschließend nur noch die Referenz auf das Attribut besorgen und können dann dessen Eigenschaft Location auswerten, z. B. so:
    [BitmapLocation]
    public class Form1 : Form    {
      private void Form1_Load(object sender, EventArgs e) {
        BitmapLocationAttribute attr =
                (BitmapLocationAttribute)Attribute.GetCustomAttribute
                (typeof(Form1),typeof(BitmapLocationAttribute));
        ...
        pictureBox1.Image = Image.FromFile(Application.StartupPath
                                   + attr.Loacation + "Bitmap1.bmp");
      }
    }
Den Pfad auf die Programmdatei liefert die statische Eigenschaft StartupPath der Klasse Application. Der Rückgabewert wird mit dem Inhalt der Eigenschaft Location des Attributs verknüpft. Damit ist die Pfadangabe beschrieben, und es fehlt nur noch der Dateiname. In diesem Codefragment ist es die Datei Bitmap1.bmp. Der Vorteil, den Sie aus dem Attribut ziehen können, kommt besonders dann zum Tragen, wenn Sie öfter auf die Ressourcen des Ordners zugreifen. Wenn Sie beabsichtigen, die Anwendung zu verteilen und den Ressourcenordner als Unterordner des Anwendungsverzeichnisses auf dem Zielrechner zu installieren, müssen Sie nur die Pfadangabe der Eigenschaft Location anpassen:
    [AttributeUsage(AttributeTargets.All)]
    public class BitmapLocationAttribute : Attribute {
       public string Loacation = "\\Bilder\\";
    }
Damit erübrigt sich alles Weitere. Wenn zur Entwicklungszeit der Zugriff auf die Ressourcen fehlerfrei möglich war, wird ein kurzes Testen der Installation ausreichen, um die korrekte Pfadangabe im Attribut zu beweisen. #### Desktop-Icon und Eintrag in das Startmenü Wenn Sie mir bis hierher gefolgt sind und auch schon eine Anwendung mit dem Installationsassistenten installiert haben, werden Sie festgestellt haben, dass das Programm nicht im Startmenü eingetragen worden ist und dass auch keine Desktop-Verknüpfung den schnellen Start der Anwendung ermöglicht. Dieser Mangel soll nun behoben werden. Im linken Teilfenster des Dateisystem-Editors werden bereits die dafür notwendigen Ordner angeboten. Sie müssen jeweils nur noch eine Verknüpfung zur Programmdatei einrichten. Dazu bieten sich zwei Wege an, die für beide Knoten identisch sind: Markieren Sie den Knoten Desktop des Benutzers bzw. Programmmenü des Benutzers. Ziehen Sie dann die Maus in das rechte Teilfenster, öffnen Sie das Kontextmenü, und wählen Sie Neue Verknüpfung erstellen. Es wird daraufhin ein Dialog angezeigt, in dem alle Knoten des Dateisystem-Editors aufgelistet sind. Doppelklicken Sie auf Anwendungsordner, und wählen Sie die Programmdatei aus (siehe Abbildung 30.6). Sie können auch im aktiven Knoten Anwendungsordner das Kontextmenü der Programmdatei öffnen und den Menüpunkt Verknüpfung erstellen zu... ausführen. Die erzeugte Verknüpfung gehört jetzt zum Anwendungsordner und muss nur noch mit der Maus in den Ordner Desktop des Benutzers bzw. Programmmenü des Benutzers verschoben werden. Für jeden Ordner ist eine eigene Verknüpfung zu erstellen. Sie können die Einträge im Programmmenü auch in einem Untermenü zur Auswahl anbieten. Dazu müssen Sie den Ordner Programmmenü des Benutzers im Dateisystem-Editor nur um einen weiteren Ordner ergänzen, in dem Sie anschließend die Verknüpfung zu der Programmdatei eintragen. Auf diese Weise lassen sich beliebige Gliederungsebenen im Programmmenü realisieren. Häufig werden diese dazu benutzt, um dem Benutzer einen direkten Zugriff auf zusätzlich ausgelieferte Programme oder die Hilfe der Anwendung anzubieten. Ähnlich machen es auch das Visual Studio 2010 und viele andere Anwendungen. Hier klicken, um das Bild zu vergrößern Abbildung 30.6 Elementauswahldialog Wenn Sie alle Verknüpfungen erstellt haben, sollten Sie keinesfalls vergessen, deren Namen neu festzulegen. Dazu bietet sich entweder das Kontextmenü des jeweiligen Eintrags an oder eine Änderung der Eigenschaft Name im Eigenschaftsfenster. Auf dem Desktop wird ein Standardsymbol in der Größe 32 × 32 Pixel angezeigt, und der Link im Programmmenü benutzt ein Standardsymbol in der Größe 16 × 16 Pixel. Sie können auch eigene Symbole (Dateierweiterung ICO) benutzen, um der Anzeige ein gefälligeres Aussehen zu verleihen. Dazu müssen die beiden Symboldateien vorliegen und in das Weitergabeprojekt eingebunden werden. Sinnvollerweise eignet sich dazu der Anwendungsordner, es darf aber auch ein beliebiger anderer Ordner sein. Um einer Verknüpfung ein individuelles Symbol zuzuordnen, markieren Sie die Verknüpfung, klicken im Eigenschaftsfenster auf Icon und wählen aus der Dropdown-Liste die Option Durchsuchen aus. Daraufhin wird der Dialog Symbol angezeigt, in dem Sie zu der Symboldatei navigieren, die Sie vorher dem Dateisystem-Editor hinzugefügt haben. Da die Symboldateien zur Liste der zu verteilenden Dateien hinzugefügt worden sind, werden sie normalerweise auf dem Zielrechner installiert. Um das zu vermeiden, können Sie die Eigenschaft Exclude dieser Dateien auf false einstellen. Die Folge ist, dass die Dateien dann nicht installiert werden, wohl aber bei der Installation zur Einrichtung verwendet werden.
Hinweis
Im Projektordner der Anwendung befindet sich bei Windows-Anwendungen die Symboldatei App.ico. Diese dient als Symbol, wenn im Windows-Explorer die Ansicht Grosse Symbole ausgewählt ist.
#### Der »Cacheordner für globale Assembly« Eine besondere Bedeutung kommt dem Cacheordner für globale Assembly zu. Dateien, die Sie diesem Ordner hinzufügen, müssen einen starken Namen haben und werden automatisch im GAC (Global Assembly Cache) eingetragen. Intern wird demnach bei der Installation jede hier eingetragene Datei mit dem gacutil-Tool registriert. Globale Assemblys, die Sie diesem Ordner hinzufügen, müssen nicht zwangsläufig auch unter Anwendungsordner aufgeführt sein. Verzichten Sie darauf, wird die Assembly nur im GAC eingetragen, kann aber nicht von anderen Anwendungen benutzt werden, denn über Verweise können in der Entwicklungsumgebung nur DLL-Dateien eingebunden werden. Möchten Sie die Dienste auch anderen Anwendungen zur Verfügung stellen, müssen Sie die Assemblierung deswegen zusätzlich in einem anderen Ordner eintragen. Meistens wird das auch der Anwendungsordner oder eines seiner Unterverzeichnisse sein.
Hinweis
Wenn Sie zusammen mit der globalen Assembly eine Publisher-Richtlinien-Assembly verteilen, muss diese zusätzlich im Cacheordner für globale Assembly angegeben werden.
### 30.1.6 Der Registrierungs-Editor Möglicherweise wollen Sie bei der Installation einer Anwendung Informationen in die Registrierungsdatenbank schreiben, die auch schon beim ersten Start der Anwendung das Laufzeitverhalten beeinflussen. Beispielsweise könnten Sie alternativ zum oben vorgestellten benutzerdefinierten Attribut BitmapLocationAttribute, das zur Lokalisierung bestimmter Ressourcen dient, in der Registrierungsdatenbank eine Pfadangabe eintragen. Die Möglichkeiten, die sich mit der internen Datenbank von Windows anbieten, sind ausgesprochen vielseitig. Im Registrierungs-Editor werden die Registrierungsschlüssel angezeigt, die den Standardregistrierungsschlüsseln von Windows entsprechen: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS Benutzer/Computer-Hive Für die beiden Registrierungsschlüssel HKEY_CURRENT_USER\Software und HKEY_LOCAL_MACHINE\Software werden außerdem automatisch zusätzliche Schlüssel angezeigt, die der Manufacturer-Eigenschaft des Weitergabeprojekts entsprechen. Die unter Benutzer/Computer-Hive eingegebenen Unterschlüssel und Werte werden im Knoten HKEY_CURRENT_USER installiert, wenn ein Benutzer bei der Installation die Option Aktueller Benutzer wählt. Wenn ein Benutzer bei der Installation Alle Benutzer auswählt, werden die Angaben im Schlüssel HKEY_USERS eingetragen.
Anmerkung
Die Auswahl Aktueller Benutzer beziehungsweise Alle Benutzer erfolgt in demjenigen Dialog bei der Installation, in dem der Benutzer den Installationsordner bestätigt oder neu angibt.
Einen neuen Unterschlüssel legen Sie über das Kontextmenü des Knotens an, zu dem der Unterschlüssel hinzugefügt werden soll. Auf diese Weise können Sie eine beliebig tiefe Gliederungsstruktur schon beim ersten Start der Anwendung gewährleisten. Soll zu einem Schlüssel ein Wert definiert werden, müssen Sie zuerst den Datentyp festlegen. Es kann sich dabei um eine Zeichenfolge, einen Umgebungs-Zeichenfolgewert, einen Binärwert oder einen DWORD-Wert handeln. Anschließend wird dem Wert ein passender Name zugewiesen. Das kann sowohl im rechten Teilfenster des Registrierungs-Editors erfolgen als auch im Eigenschaftsfenster unter Value. Hier klicken, um das Bild zu vergrößern Abbildung 30.7 Der Registrierungs-Editor mit einem zusätzlichen Schlüssel In Abbildung 30.7 ist im Registrierungs-Editor ein Schlüssel eingetragen, der Meldung heißt. Der Wert ist vom Typ string und beschreibt eine zugewiesene Zeichenfolge, die zumindest einmal nach der Installation angezeigt werden soll.
Hinweis
Für jeden Registrierungswert kann man einen Standardwert festlegen, allerdings darf es für jeden Schlüssel nur ein Standardwert sein. Um einen Standardwert festzulegen, markieren Sie den entsprechenden Wert, öffnen das Kontextmenü und klicken auf Umbenennen. Danach löschen Sie den Namen und bestätigen sofort mit der Eingabetaste. Der ursprüngliche Bezeichner wird dann durch (Standard) ersetzt.
Mit der Eigenschaft DeleteAtUninstall kann das Verhalten eines Schlüssels einschließlich aller seiner Unterschlüssel bei der Deinstallation einer Anwendung beschrieben werden. Mit true wird der Schlüssel aus der Registrierung gelöscht; mit false, der Standardeinstellung, soll das nicht der Fall sein. Allerdings haben Versuche gezeigt, dass es keinen Unterschied zwischen der Einstellung true und false gibt, da die Schlüsseleinträge einer Anwendung nach der Deinstallation grundsätzlich immer gelöscht werden. ### 30.1.7 Der Dateityp-Editor Wenn Sie im Windows-Explorer auf eine Dokumentendatei mit der Erweiterung .DOC doppelklicken, öffnet sich automatisch Microsoft Word, und das Dokument wird angezeigt. Die Ursache für dieses Verhalten ist die Verknüpfung des Dateityps mit der Anwendung. Mit dem Dateityp-Editor können Sie dieses Verhalten nach der Installation einer Anwendung erreichen. Wählen Sie dazu im Projektmappen-Explorer des Weitergabeprojekts die vierte Schaltfläche von links in der Symbolleiste. Im Arbeitsbereich der Entwicklungsumgebung öffnet sich ein neues Fenster, das im Gegensatz zu den beiden vorher besprochenen nur einen Anzeigebereich mit dem Knoten Dateitypen auf dem Zielcomputer aufweist. Über dessen Kontextmenü können Sie einen oder mehrere Dateitypen hinzufügen. Diese Dateitypen werden bei der Installation mit der Anwendung verknüpft, sodass bestimmte Aktionen, beispielsweise das Öffnen mit einem Doppelklick, automatisch erfolgen. Ist ein neuer Datentyp hinzugefügt worden, erscheint im Dateityp-Editor ein untergeordneter Knoten, dem Sie einen passenderen Namen geben sollten. Ferner ist mit &Open dem Knoten sofort eine Aktion zugeordnet. #### Eigenschaften eines Dateityps Der Knoten eines zu verknüpfenden Dateityps weist mehrere Eigenschaften auf, die wir uns nun zuerst im Überblick ansehen wollen.

Tabelle 30.3 Eigenschaften eines registrierten Dateityps

Eigenschaft | Beschreibung
Command | Diese Eigenschaft gibt die ausführbare Datei an, die beim Ausführen einer Aktion mit diesem Dateityp gestartet wird.
Description | Der Inhalt dieser Eigenschaft wird im Windows Explorer in der Detailansicht in der Spalte Typ angezeigt.
Extensions | In dieser Eigenschaft wird ohne vorangestelltes Sternchen der Dateityp angegeben, der auf dem Zielrechner registriert werden soll. Mehrere Dateierweiterungen werden durch ein Semikolon getrennt.
Icon | Gibt das Symbol an, das für die Dateien dieses Typs angezeigt werden soll.
MIME | Gibt einen oder mehrere MIME-Typen (Multipurpose Internet Mail Extension) an, die dem Dateityp auf dem Zielcomputer zugeordnet werden sollen. (Anmerkung: MIME-Typen werden verwendet, um anzugeben, wie Client-Webbrowser und E-Mail-Anwendungen binäre Daten verarbeiten.)
Name | Gibt den im Dateityp-Editor verwendeten Namen an.
Nachdem Sie der Eigenschaft Extensions eine oder auch mehrere Dateierweiterungen zugeordnet haben, sollten diese Dateitypen mit der Anwendung verknüpft werden, die für die Aktionen mit den Dateien verantwortlich ist. Markieren Sie dazu die Eigenschaft Command, und klicken Sie auf die Schaltfläche in der Wertespalte des Eigenschaftsfensters. Im sich daraufhin öffnenden Dialog werden alle Knoten des Dateisystem-Editors aufgelistet. Sie müssen nur noch die Datei auswählen, die bei den Aktionen mit diesem Dateityp ausgeführt werden soll. Meistens wird es eine EXE-Datei sein, die unter Anwendungsordner zu finden ist. Schicker und auch professioneller sieht es aus, wenn der Dateityp im Windows Explorer ein individuelles Symbol anzeigt. Die dazugehörige ICO-Datei muss ebenfalls im Dateisystem-Editor dem Weitergabeprojekt hinzugefügt worden sein. Wenn Sie bei markierter Icon-Eigenschaft auf die Pfeilschaltfläche klicken und dann Durchsuchen wählen, öffnet sich ein Dialogfenster, in dem Sie zu der Symboldatei navigieren können. Zuletzt tragen Sie unter Description noch eine Zeichenfolge ein, die in der Detailansicht des Windows Explorers den Benutzern eine informative Beschreibung des Dateityps anzeigt. #### Eigenschaften der Aktionen Unter jedem neuen Dateitypeintrag wird mit &Open sofort eine Aktion beschrieben. An der Fettschrift lässt sich erkennen, dass es sich dabei um die Standardaktion handelt, die mit einem Doppelklick auf eine Datei ausgelöst wird.
Anmerkung
Bei der Standardaktion handelt es sich um die Aktion, die sich an oberster Position eines Dateitypknotens befindet. Wenn Sie noch weitere Aktionen hinzugefügt haben und eine davon zur Standardaktion erklären wollen, muss diese nur mittels Drag & Drop auf die oberste Position gezogen werden.
Eine andere typische Aktion ist das Drucken eines Dokuments. Wird im Windows Explorer das Kontextmenü einer markierten Datei geöffnet, werden die für den Dateityp spezifizierten Aktionen als Menüelemente angezeigt. Der Inhalt der Name-Eigenschaft einer im Dateityp-Editor definierten Aktion dient als Befehl für das Kontextmenü. Daher sollten Sie die Standardvorgabe von &Open in &Öffnen ändern – zumindest wenn Sie eine deutschsprachige Anwendung ausliefern wollen. Das kaufmännische Und-Zeichen (&) vor einem Buchstaben kennzeichnet auch hier nur ein Tastenkürzel für den schnelleren Zugriff. Über das Kontextmenü einer Datei können die festgelegten Aktionen ausgeführt werden. Nehmen wir an, es würde sich dabei um das Öffnen und das Drucken handeln. Die Wahl einer Aktion führt natürlich nicht sofort dazu, dass die Aktion auch ausgeführt wird. Vielmehr muss dem startenden Programm ein Befehlszeilenargument übermittelt werden, dessen Auswertung erst die gewünschte Operation in die Wege leitet. Das Befehlszeilenargument wird in die Eigenschaft Arguments der Aktion eingetragen. Entscheidet sich der Benutzer zur Laufzeit für eine bestimmte Aktion, wird der mit der Aktion verbundene Arguments-Eintrag als Befehlszeilenargument an die startende Anwendung übergeben. (Sie erinnern sich: Die Anwendung wird unter Command eingetragen.) Ausgewertet werden muss das übergebene Argument in der Main-Methode, die normalerweise parameterlos ist, aber auch ein Zeichenfolge-Array entgegennehmen kann. Das Befehlszeilenargument dient zur Identifizierung der ausgewählten Aktion. Das reicht allerdings noch nicht aus, denn der startenden Anwendung muss auch noch mitgeteilt werden, welche Datei den Start der Anwendung verursacht hat. Damit könnte die Arguments-Eigenschaft der Aktion Öffnen beispielsweise wie folgt aussehen:
    "%1" OpenDocument
Für die zweite Aktion, das Drucken des Dateiinhalts, könnte Arguments die folgende Zeichenfolge enthalten:
    "%1" PrintDocument
Das Argument "%1" stellt die Datei einschließlich der Pfadangabe im ersten Befehlszeilenargument zur Verfügung. Die durch ein Leerzeichen getrennte, sich anschließende Zeichenfolge OpenDocument bzw. PrintDocument wird von der Anwendung zur Identifizierung der auslösenden Aktion herangezogen. Es steht Ihnen natürlich auch frei, noch weitere Argumente zu definieren. In Abbildung 30.8 ist der Dateityp-Editor zu sehen, wie er sich nach dem Eintragen der beiden Aktionen Öffnen und Drucken darstellt. Hier klicken, um das Bild zu vergrößern Abbildung 30.8 Der Dateityp-Editor Das folgende Codefragment zeigt eine Main-Methode, die in Abhängigkeit von den übergebenen Argumenten gestartet wird.
    static void Main(string[] args) {
      if(args.Length == 0)
        Application.Run(new Form1());
      else {
        string file = args[0];
        if(args[1] == "OpenDocument") {
          // Anweisungen, die das Öffnen des Dokuments bewirken
        }
        else if(args[1] == "PrintDocument") {
          // Anweisungen, die das Drucken des Dokuments bewirken
        }
      }
    }
### 30.1.8 Der Benutzeroberflächen-Editor Der Editor, der die meisten Möglichkeiten bietet, ist der Benutzeroberflächen-Editor. Er dient dazu, das Standardinstallationsprogramm um zusätzliche Dialoge zu erweitern, die während der Installation ausgewertet werden. In Abbildung 30.9 ist der Editor so abgebildet, wie er sich nach dem Öffnen zeigt. Bemerkenswert ist, dass zwischen einer gewöhnlichen Installation und einer Administratorinstallation unterschieden wird. Dabei beschreibt der Knoten Installieren den Installationsprozess eines normalen Endanwenders, während der Knoten Administratorinstallation ein Upload des Installationsprogramms aus dem Netzwerk vorsieht. In diesem Abschnitt werden wir uns nur mit der gewöhnlichen Installation beschäftigen, die ein einzelner Benutzer durchführt. Hier klicken, um das Bild zu vergrößern Abbildung 30.9 Der Benutzeroberflächen-Editor Jeder der beiden Abschnitte Installieren und Administratorinstallation gliedert sich in die drei Bereiche Starten, Status und Beenden. Jedem Bereich sind bereits Dialoge zugeordnet, deren Aussehen sich – wenn auch in einem geringen Umfang – verändern lässt. Jeder einzelne Abschnitt kann auch noch durch weitere Dialoge ergänzt werden. Sie müssen nicht alle Dialoge der Standardinstallation übernehmen und können sogar im Extremfall eine automatische Installation der Anwendung ohne die Anzeige eines einzigen Dialogs erzwingen. Die Reihenfolge der Anzeige der Dialogfenster bei der Installation entspricht der Reihenfolge im Benutzeroberflächen-Editor von oben nach unten. Allerdings hat dieser Editor einen nicht unbedeutenden Nachteil: Sie können sich die Dialogfenster nicht anzeigen lassen und erhalten somit auch kein Feedback zu den resultierenden Änderungen. Ihnen bleibt daher nichts anderes übrig, als auf Verdacht hin mit den Dialogen zu arbeiten und das Ergebnis bei einer Probeinstallation zu begutachten. #### Eigenschaften der Standard-Installationsdialoge Die Standard-Installationsdialoge weisen einige Eigenschaften auf, um die Optik ein wenig zu beeinflussen. Allerdings sind dabei sehr enge Grenzen gesetzt. Verschaffen wir uns zunächst einen Überblick über alle Eigenschaften, die jedoch nicht von allen Dialogen gleichermaßen veröffentlicht werden.

Tabelle 30.4 Eigenschaften der Standard-Installationsdialoge

Eigenschaft | Beschreibung
BannerBitmap | Gibt die Bitmap- oder JPEG-Grafikdatei an, die im Dialog angezeigt wird.
CopyrightWarning | Gibt den Text für einen Copyright-Vermerk im Dialog Willkommen an.
ShowProgressBar | Gibt an, ob der Fortschrittsbalken im Dialog Status angezeigt werden soll.
UpdateText | Gibt den Text an, der im Dialog Fertig angezeigt werden soll.
WelcomeText | Gibt den Text an, der im Dialog Willkommen angezeigt werden soll.
Per Voreinstellung wird in den Dialogen in einem Bildfeld eine Standardbitmap angezeigt, die dann rechts im Fenster erscheint. Mit der Eigenschaft BannerBitmap können Sie die Standardbitmap gegen eine eigene Bitmap (oder alternativ eine JPEG-Grafikdatei) austauschen. Damit diese weder gestaucht noch gestreckt dargestellt wird, sollte sie eine Größe von 500 × 70 Pixel haben. Die Bitmap muss vorher mit dem Dateisystem-Editor eingefügt werden. Mit Ihrer Bitmap ersetzen Sie aber nicht die Beschriftung, die im gleichen Bereich angezeigt wird. Damit kommt der Bitmap eher die Funktion einer Hintergrundbitmap zu. Es scheint auch keine Möglichkeit zu geben, die Beschriftung durch eine andere zu ersetzen. Der Dialog Willkommen zeigt einen Text an, der vor Urheberrechtsverletzungen warnt: Warnung: Dieses Programm ist durch US-amerikanische Urheberrechtsgesetze und internationale Urheberrechtsverträge geschützt. Unbefugte Vervielfältigung oder unbefugter Vertrieb dieses Programms oder eines Teils davon wird sowohl straf- als auch zivilrechtlich verfolgt und kann schwere Strafen und Schadenersatzforderungen zur Folge haben. Sie können diese Vorgabe durch eine eigene ersetzen. Dazu müssen Sie die Eigenschaft CopyrightWarning überschreiben. Darüber hinaus zeigt derselbe Dialog auch einen Begrüßungstext an, der durch die Eigenschaft WelcomeText bereitgestellt wird und mit kurzen Worten die Funktion des Installationsprogramms beschreibt: Der Installer wird Sie durch die zur Installation von [ProductName] erforderlichen Schritte führen. Wenn Sie wollen, können Sie auch diesen Text durch einen eigenen ersetzen. Während der Installation wird der Anwender durch einen Fortschrittsbalken im Dialog Status über den Fortschritt des Installationsprozesses informiert. Mit der Eigenschaft ShowProgressBar kann der Balken auch ausgeschaltet werden, was allerdings nicht empfehlenswert ist. Der letzte Dialog der Standardinstallation lautet Fertig. Neben der obligatorischen Möglichkeit, eine eigene Bitmap anzuzeigen, wird der in der Eigenschaft UpdateText angegebene Text angezeigt, der den Anwender dazu auffordert, gegebenenfalls das .NET Framework zu aktualisieren: Prüfen Sie mit Windows Update, ob wichtige Aktualisierungen für .NET Framework zur Verfügung stehen. Dass Sie auch bei diesem Text Anpassungen vornehmen können, braucht kaum noch erwähnt zu werden. #### Weitere Dialoge einfügen In jede der drei Gruppen Starten, Status und Beenden können Sie bei Bedarf noch weitere Dialoge einfügen, mit denen sich der Ablauf der Installation steuern lässt. Jeder Dialog darf allerdings nur einmal in einem Weitergabeprojekt verwendet werden. Es wäre auch falsch zu glauben, diese Dialoge wie normale WinForms behandeln zu können. Tatsächlich ist die jeweilige Einflussnahme auf nur wenige Eigenschaften beschränkt. Verschaffen wir uns zunächst einen Überblick über das Angebot: Mit einem Splash-Dialog kann eine Begrüßungsbitmap angezeigt werden. Mithilfe des Dialogs Benutzer registrieren kann der Benutzer Registrierungsinformationen durch eine von Ihnen zur Verfügung gestellte ausführbare Datei übermitteln. Im Dialog Kundeninformationen wird der Anwender zur Eingabe seines Namens, des Namens der Firma und optional auch zur Eingabe einer Seriennummer aufgefordert. Das Dialogfeld Lizenzvertrag zeigt einen Lizenzvertrag an, den der Benutzer lesen und bestätigen muss. Dazu kommt ein Dialog zur Anzeige von zusätzlichen Informationen, der dem zuvor angeführten Dialog Lizenzvertrag ähnelt. Es stehen Dialoge zur Verfügung, die es erlauben, zwischen zwei und maximal vier Optionsschaltflächen anzuzeigen. Dialoge mit bis zu vier Kontrollkästchen ermöglichen die Auswahl optionaler Komponenten. Somit können in einem Weitergabeprojekt maximal drei verschiedene Dialoge mit Kontrollkästchen angeboten werden. Insgesamt stehen drei Dialogfenster zur Verfügung, die bis zu maximal vier Textfelder einzeigen können, in denen der Anwender Einträge vornehmen kann. Um das Weitergabeprojekt um einen der aufgeführten zusätzlichen Dialoge zu ergänzen, markieren Sie zuerst einen der drei Bereiche und öffnen dann das Kontextmenü. Nach dem Klicken auf Dialogfeld hinzufügen können Sie aus dem sich öffnenden Fenster den gewünschten Dialog auswählen (siehe Abbildung 30.10). Dialoge, die Sie dem Projekt bereits hinzugefügt haben, werden bei einem erneuten Öffnen nicht mehr angeboten. Hier klicken, um das Bild zu vergrößern Abbildung 30.10 Hinzufügen von Dialogen zum Weitergabeprojekt #### Dialog »Splash« Ähnlich wie beim Starten einer Anwendung kann auch eine Programminstallation mit der Anzeige eines Splash-Fensters eröffnet werden. Bedauerlicherweise weist dieses Fenster jedoch eine Titelleiste auf, die sich nicht ausblenden lässt. Um zum nächsten Dialog zu gelangen, muss der Anwender auf eine Weiter-Schaltfläche klicken. Fast über den gesamten Clientbereich des Fensters erstreckt sich eine Picturebox zur Aufnahme einer Bitmap oder JPEG-Datei (Eigenschaft SplashBitmap). Die Größe des Bildes sollte eine Abmessung von 480 × 320 Pixel haben, damit es weder gestreckt noch gestaucht angezeigt wird. Die einzige Möglichkeit, die Bildanzeige zu manipulieren, bietet die Eigenschaft Sunken. Mit der Voreinstellung true wird die Grafik innerhalb des Rahmens abgesenkt dargestellt. #### Dialog »Benutzer registrieren« Mithilfe dieses Dialogs, der meist nach der Installation der Anwendung angezeigt wird, kann der Benutzer Registrierungsinformationen durch eine von Ihnen zur Verfügung gestellte ausführbare Datei übermitteln. Diese Datei wird unter der Eigenschaft Executable eingetragen und muss zum Weitergabeprojekt gehören. Sollen der Datei zusätzliche Befehlszeilenargumente übergeben werden, tragen Sie diese in der Eigenschaft Arguments ein. Der Dialog enthält die Schaltfläche Jetzt registrieren, über die die ausführbare Datei während der Installation gestartet wird. In Abbildung 30.11 sehen Sie diesen Dialog für ein Weitergabeprojekt, dessen ProductName-Eigenschaft Setup1 lautet. Hier klicken, um das Bild zu vergrößern Abbildung 30.11 Dialog »Benutzer registrieren« #### Dialog »Kundeninformationen« Das Dialogfeld Kundeninformationen fordert vom Benutzer die Eingabe seines Namens, seiner Firma und die Eingabe der Seriennummer (siehe Abbildung 30.12). Hier klicken, um das Bild zu vergrößern Abbildung 30.12 Dialog »Kundeninformationen« Neben BannerBitmap besitzt dieser Dialog drei spezielle Eigenschaften, die Sie Tabelle 30.5 entnehmen können.

Tabelle 30.5 Eigenschaften des Dialogs »Kundeninformationen«

Eigenschaft | Beschreibung
SerialNumberTemplate | Definiert eine Vorlage, die zur Überprüfung der eingegebenen Seriennummer verwendet wird.
ShowOrganization | Legt fest, ob das Feld Organisation angezeigt wird.
ShowSerialNumber | Legt fest, ob das Feld Seriennummer angezeigt wird.
Wird vom Anwender die Angabe einer Seriennummer verlangt, legt die Eigenschaft SerialNumberTemplate die Eingabeschablone fest, an die sich der Anwender halten muss. Abhängig davon, wie die Schablone vorgegeben ist, wird eine unterschiedliche Anzahl von Eingabefeldern angezeigt. Die Eingabe der Seriennummer wird von einem internen Algorithmus des Windows Installers überprüft, der bestimmte Zahlen addiert und die resultierende Summe durch sieben dividiert. Bleibt als Divisionsrest null, kann der Anwender die Installation fortsetzen, ansonsten weist ein Meldungsfenster ihn darauf hin, dass die Seriennummer falsch ist. Welche Zahlen vom Überprüfungsalgorithmus erfasst werden, legt die Schablone der Eigenschaft SerialNumberTemplate fest, für die mehrere Platzhalter vordefiniert sind (siehe Tabelle 30.6).

Tabelle 30.6 Platzhalter der Eigenschaft »SerialNumberTemplate«

Platzhalter | Beschreibung
# | Steht für eine Zahl, die nicht vom Überprüfungsalgorithmus erfasst wird.
% | Steht für eine Zahl, die vom Überprüfungsalgorithmus erfasst wird.
? | Steht für ein alphanumerisches Zeichen, das nicht vom Überprüfungsalgorithmus erfasst wird.
^ | Erfordert ein Zeichen in Großschreibung oder eine Zahl. Eine Zahl wird vom Überprüfungsalgorithmus nicht erfasst.
Die Schablone muss in spitze Klammern eingeschlossen werden. Sehen wir uns nun an, wie wir mit der Angabe der Seriennummer zumindest weitestgehend das unberechtigte Installieren unserer Anwendung wenn schon nicht vermeiden, so aber doch erschweren können. Angenommen, die Eigenschaft SerialNumberTemplate würde die folgende Einstellung aufweisen:
    <###-%%%%%%%>
Bei der Installation werden zwei Eingabefelder angezeigt: In das erste muss der Anwender drei Zahlen eingeben, in das zweite sieben. Zwei Eingabefelder werden erzwungen, weil zwischen dem dritten und vierten Platzhalter ein Bindestrich steht. Nur dann, wenn die Quersumme eine durch sieben teilbare Zahl ergibt, wird die Installation fortgesetzt. Damit wären unter anderem die Zahlenkombinationen 0000000, 0000007 oder auch 2002003 zulässig. Das sieht natürlich im ersten Moment noch sehr einfach und durchschaubar aus, aber halten Sie sich vor Augen, dass der Benutzer – selbst wenn er den Überprüfungsalgorithmus kennen sollte – nicht weiß, welche der insgesamt zehn Zahlen zur Bildung der Quersumme herangezogen werden. Beispielsweise könnte die Schablone auch folgendermaßen definiert sein:
    <#%%-##%#%%#>
Nun ist es die Summe aus der ersten, vierten, fünften, siebten und zehnten Zahl, die darüber entscheidet, ob die Installation durchgeführt werden kann. Nur die beiden Platzhalterkombinationen ^ mit ? und # mit % werden gemeinsam in einem Eingabefeld angezeigt – es sei denn, mit einem Bindestrich werden separate Eingabefelder erzwungen. Alle anderen Kombinationen führen dazu, dass zwischen den Platzhaltern intern ein Bindestrich gesetzt wird. Damit haben Sie nun alle Mittel in der Hand, um durch eine genügend komplexe Seriennummer einer unzulässigen Verteilung Ihrer Anwendung entgegenzuwirken. #### Dialog »Lizenzvertrag« Dieser Dialog zeigt einen Lizenzvertrag an, den der Benutzer lesen (sollte) und bestätigen muss. Die Weiter-Schaltfläche wird erst dann aktiviert, wenn der Benutzer auf die Optionsschaltfläche Ich stimme zu klickt. Hier klicken, um das Bild zu vergrößern Abbildung 30.13 Dialog »Lizenzvertrag« Die Lizenzinformationen müssen in einer RTF-Datei gespeichert sein, die natürlich auch im Dateisystem-Editor hinzugefügt sein muss. Ein RTF-Dokument können Sie beispielsweise mit MS Word erstellen. In der Eigenschaft LicenseFile des Dialogs geben Sie die Datei an. Außer bei der Eigenschaft BannerBitmap können Sie mit der Eigenschaft Sunken den Inhalt der Lizenzinformationen in einem abgesenkten Rahmen darstellen. #### Dialog »Infodatei« Der Dialog Infodatei gleicht dem Dialog Lizenzvertrag, der im vorhergehenden Abschnitt besprochen wurde und in Abbildung 30.13 zu sehen ist. Eine Abbildung erübrigt sich daher auch. Der einzige Unterschied besteht darin, dass der Anwender nicht gezwungen wird, den Bedingungen des Lizenzvertrages zuzustimmen. Die Weiter-Schaltfläche ist deshalb auch immer aktiviert. Der Inhalt des Anzeigefelds des Dialogs wird wiederum einer RTF-Datei entnommen. Die Eigenschaft, die der Datei zugewiesen wird, lautet bei diesem Dialog allerdings ReadmeFile. #### Dialoge mit Optionsschaltflächen Wollen Sie dem Benutzer Auswahloptionen anbieten, müssen Sie in der Installationsroutine Dialogfelder mit sich gegenseitig ausschließenden Optionen anbieten. Es stehen insgesamt drei verschiedene Dialoge mit zwei, drei oder vier Auswahlmöglichkeiten zur Verfügung. Jeder Dialog darf einmal zum Weitergabeprojekt hinzugefügt werden. Auf diese Weise könnten Sie beispielsweise dem Anwender die Entscheidung überlassen, ob er eine zusätzliche Anwendung oder Datei installieren möchte oder nicht. Die Auswahl des Anwenders wird während des Installationsprozesses ausgewertet und berücksichtigt. In Abbildung 30.14 wird exemplarisch der Dialog mit zwei Optionsschaltflächen gezeigt, wie er sich ohne Eigenschaftsänderung präsentiert. Hier klicken, um das Bild zu vergrößern Abbildung 30.14 Dialog mit zwei Optionsschaltflächen Natürlich können Sie, wie bei allen anderen Dialogen, eine anwendungsspezifische Bitmap anzeigen, aber darüber hinaus bietet dieser Dialog mit der Eigenschaft BannerText auch die Möglichkeit, Einfluss auf die über der Bitmap angezeigte Zeichenfolge zu nehmen. Dem Benutzer müssen Sie natürlich auch mitteilen, welche Auswirkungen die Wahl einer der Optionsschaltflächen hat. Den entsprechenden Text tragen Sie im Eigenschaftsfenster in der Eigenschaft BodyText ein. Jede Optionsschaltfläche wird durch zwei Eigenschaften beschrieben: Label und Value. Genau genommen heißen die beiden Eigenschaften beispielsweise Button1Label und Button1 Value, sind also um ein Präfix ergänzt worden, um innerhalb des Eigenschaftsfensters eine eindeutige Zuordnung zu einer bestimmten Schaltfläche sicherzustellen. Der Einfachheit halber wird aber im Folgenden auf das Präfix verzichtet. Die Eigenschaft Label enthält die Beschriftung der Optionsschaltfläche, und Value ist der Wert, den eine Optionsschaltfläche zurückliefert, wenn sie ausgewählt ist. Die Eigenschaft ButtonProperty enthält den Namen, der dem Dialog zugeordnet ist. Er lautet bei einem Dialog mit zwei Optionsschaltflächen BUTTON2, bei einem Dialog mit drei Optionsschaltflächen analog BUTTON3. Sie sollten diese Einträge nach Möglichkeit nicht ändern, da bei einer späteren Auswertung sonst möglicherweise Installationsergebnisse vorliegen, die der Anwender nicht gewünscht hat. Der Windows Installer prüft nämlich nicht die Eindeutigkeit. Wenn Sie zum Beispiel die Eigenschaft Value von zwei Optionsschaltflächen auf 1 einstellen, wird das Weitergabeprojekt zwar anstandslos kompiliert, aber eine Fehlermeldung wird den Installationsprozess unbarmherzig beenden. Die letzte Eigenschaft ist DefaultValue. Sie weist standardmäßig den Wert 1 auf. Damit wird festgelegt, dass diejenige Optionsschaltfläche vorselektiert ist, die in ihrer Eigenschaft Value genau diese Zahl aufweist. Hier klicken, um das Bild zu vergrößern Abbildung 30.15 Eigenschaftsfenster des Dialogs mit zwei Optionsschaltflächen Nun bleibt noch die Frage zu klären, wie der Windows Installer die Auswahl während der Anwendungsinstallation verarbeitet. Dazu weisen viele Elemente des Setup-Projekts eine Condition-Eigenschaft auf, zum Beispiel jede Datei, die im Dateisystem-Editor eingetragen ist. Per Voreinstellung ist diese Eigenschaft leer, was der Installationsprozess dahingehend interpretiert, dass die entsprechende Komponente installiert werden soll. Sollte jedoch eine Bedingung formuliert sein, muss diese zu true ausgewertet werden, andernfalls wird das Element nicht installiert. Elemente, die eine Condition-Eigenschaft bereitstellen, sind Dateien, Ordner, Registrierungseinträge sowie benutzerdefinierte Aktionen und Startbedingungen. Kommen wir noch einmal zu unserem Ausgangsbeispiel zurück. Angenommen, Sie haben dem Dateisystem-Editor die Datei xyz.exe hinzugefügt, deren Installation von der Wahl des Benutzers abhängig gemacht werden soll. Der Dialog mit den Optionsschaltflächen könnte so aussehen, wie in Abbildung 30.16 gezeigt. Als Vorgabe ist hier die zweite Optionsschaltfläche selektiert, was der Einstellung DefaultValue=2 entspricht (die Value-Eigenschaften sind nicht verändert worden). Hier klicken, um das Bild zu vergrößern Abbildung 30.16 Beispiel eines Dialogs mit Optionsschaltflächen Die Eigenschaft Condition der Datei xyz.exe ist im Dateisystem-Editor auf
    BUTTON2=1
eingestellt. Entscheidet sich der Anwender zur Installationszeit dafür, die Datei zu installieren, wird die Eigenschaft ButtonProperty, also BUTTON2 abgerufen. Ist der Inhalt 1, ist die obere Optionsschaltfläche ausgewählt; ist der Inhalt 2, handelt es sich um die untere. #### Dialoge mit Kontrollkästchen Die Dialogfelder mit Kontrollkästchen sind denen mit Optionsschaltflächen sehr ähnlich. Sie werden zur Darstellung von bis zu vier Auswahlmöglichkeiten verwendet und geben deren Werte gleichermaßen während der Installation zurück. Insgesamt können in einem Weitergabeprojekt drei dieser Dialoge aufgenommen werden, die als Typ A, B und C bezeichnet werden. Jeder einzelne Typ kann jedoch nur einmal hinzugefügt werden. Alle drei Dialogfenster sind identisch und können mit den Eigenschaften BannerBitmap, BannerText und BodyText anforderungsgerecht gestaltet beziehungsweise beschriftet werden. Per Vorgabe weisen die Dialoge vier Kontrollkästchen auf. Benötigen Sie weniger, müssen Sie nur die Eigenschaft Visible=false setzen. Jedes Kontrollkästchen weist eine ihm eigene Eigenschaft Label auf, die den Beschreibungstext enthält, und eine Eigenschaft Value, die entweder auf Checked oder Unchecked eingestellt ist. Der Standard ist Unchecked. Ausgewertet wird der Zustand eines Kontrollkästchens wiederum mit der Eigenschaft Condition. Angenommen, eine Datei soll genau dann installiert werden, wenn im Dialog Kontrollkästchen A ausgewählt ist, dann tragen Sie in der Condition-Eigenschaft der Datei den Inhalt der Eigenschaft CheckBox1Property ein, die standardmäßig CHECKBOXA1 lautet.
Hinweis
Beachten Sie, dass der Identifizierer des Kontrollkästchendialogs, also A, B oder C, einen Teil des Eigenschaftwerts ausmacht und somit eine Unterscheidungsmöglichkeit zwischen den Kontrollkästchen der drei identischen Dialoge ermöglicht.
#### Dialog mit Textfeldern Dialoge mit Textfeldern werden verwendet, um dem Benutzer bis zu maximal vier Möglichkeiten für individuelle Einträge anzubieten. Während der Installation können die Einträge ausgewertet werden. Wie bei den Dialogen mit Kontrollkästchen stehen einem Weitergabeprojekt maximal drei Eingabedialoge zur Verfügung (Typ A, B und C), wobei jeder einzelne nur einmal je Weitergabeprojekt hinzugefügt werden kann. Den gesamten Dialog betreffende Eigenschaften sind BannerBitmap, BannerText und BodyText. Jedes Eingabefeld wird durch eine Label-, Property- und Value-Eigenschaft beschrieben. Beim ersten, zuoberst angezeigten Eingabefeld im Dialog A lauten die Eigenschaften Edit1Label, Edit1Property und Edit1Value. Die Eigenschaft Label enthält den Text, der rechts vom Eingabefeld angezeigt wird, und die Value-Eigenschaft gibt den Text im Eingabefeld an. Property gibt den Eigenschaftsnamen an, der ausgewertet werden kann. Einträge in die Textfelder können beispielsweise dazu benutzt werden, in der Registrierung gespeichert zu werden. Dazu muss die Condition-Eigenschaft des entsprechenden Registrierungseintrags auf den Wert der Property-Eigenschaft gesetzt werden. ### 30.1.9 Editor für benutzerdefinierte Aktionen Mit dem Editor für benutzerdefinierte Aktionen lassen sich weitere Aktionen festlegen, die während der Installation auf dem Zielrechner ausgeführt werden sollen. Beispielsweise könnte mit einer benutzerdefinierten Aktion eine Datenbank erzeugt werden. Schlägt die Installation der Anwendung fehl, kann die Datenbank auch wieder gelöscht werden. Benutzerdefinierte Aktionen sind in Dateien programmiert. Dabei kann es sich um EXE-, DLL- oder Skriptdateien handeln. Der Editor beschreibt vier Bereiche: Installieren, Commit ausführen, Rollback und Deinstallieren. Jedem dieser Bereiche kann über sein Kontextmenü eine benutzerdefinierte Aktion zugeteilt werden – also nichts anderes als eine Datei, die ausgeführt wird und die gewünschte Operation bereitstellt. Die angegebenen Dateien müssen natürlich zum Weitergabeprojekt gehören. Hier klicken, um das Bild zu vergrößern Abbildung 30.17 Der Editor für benutzerdefinierte Aktionen Dem Knoten Installieren werden die Aktionen hinzugefügt, die am Ende der Installationsphase ausgeführt werden sollen, also wenn alle anderen Dateien bereits installiert worden sind. Während der Installation kann es zu Fehlern kommen. Wollen Sie in dieser Situation bestimmte Operationen automatisch ausführen lassen, tragen Sie diese unter dem Knoten Rollback ein. Nach einer erfolgreichen Installation werden alle Aktionen ausgeführt, die unter dem Knoten Commit ausführen eingetragen sind. Auch an die Deinstallation einer Anwendung wird mit diesem Editor gedacht. Benutzerdefinierte Aktionen im Knoten Deinstallieren werden aufgerufen, wenn eine Anwendung deinstalliert wird. ### 30.1.10 Editor für Startbedingungen #### Möglichkeiten des Editors Ob eine Anwendung überhaupt installiert werden kann beziehungsweise in welchem Umfang eine Installation erfolgt, kann mit dem Editor für Startbedingungen festgelegt werden. So können Sie zum Beispiel nach einer bestimmten Datei suchen, nach Registrierungseinträgen oder auch nach der Information, ob auf dem Zielcomputer das passende .NET Framework installiert ist. Die Einstellungen im Editor für Startbedingungen werden vor Beginn der Installation überprüft. Das Ergebnis fällt entweder positiv oder negativ aus. In den meisten Fällen muss der Installationsprozess reagieren, wenn die Überprüfung ein negatives Ergebnis liefert. Das Installationsprogramm kann dann zwei Verhaltensweisen zeigen: Die Installation wird mit einer Fehlermeldung abgebrochen. Die Installation wird fortgesetzt. Möglicherweise werden dabei auch die Voraussetzungen dafür geschaffen, dass die Anwendung später problemlos ausgeführt werden kann. #### Oberfläche des Editors Die Oberfläche des Editors zeigt sich in einem einteiligen Fenster, in dem bereits Knoten vordefiniert sind. Unterhalb des Stammknotens Anforderungen für den Zielcomputer sind mit Zielcomputer durchsuchen und Startbedingungen zwei untergeordnete Knoten eingetragen. Letzterer hat auch schon mit .NET Framework einen Eintrag, der auf dem Zielrechner nach dem .NET Framework sucht. Dieser Eintrag kann nicht gelöscht werden. Öffnen wir das Kontextmenü des Stammknotens, werden uns drei mögliche Startkonditionen angeboten (siehe Abbildung 30.18). Hier klicken, um das Bild zu vergrößern Abbildung 30.18 Editor für Startbedingungen #### Suche nach einer Datei Mit einer Dateistartkondition können wir den Zielcomputer nach einer bestimmten Datei durchsuchen. Mit einer Registrierungsstartkondition durchsuchen wir die Registrierung nach einem bestimmten Schlüssel, und mit der Windows Installer-Startbedingung fahnden wir auf dem Zielrechner nach einer bestimmten Komponente. Wenn Sie aus dem Kontextmenü eine dieser Bedingungen auswählen, wird der Knoten Zielcomputer durchsuchen um das ausgewählte Element ergänzt. Elemente, die dem Knoten Zielcomputer durchsuchen untergeordnet sind, definieren die Eigenschaften der Suche. Markieren Sie den Elementeintrag, werden im Eigenschaftsfenster die dem Element zugeordneten Eigenschaften angezeigt. Wird nach einer Datei gesucht, tragen Sie den Namen der Datei unter der Eigenschaft FileName ein. Der zu durchsuchende Ordner entspricht der Angabe unter Folder. Wenn es notwendig ist, lassen sich darüber hinaus die Testkriterien durch weitere Eigenschaften noch weiter einschränken. Beispielsweise kann mit MaxSize die maximale Größe in Bytes für eine Datei bei einer Dateisuche auf dem Zielcomputer angegeben werden. Das Ergebnis des Tests wird in eine Variable geschrieben, die der Eigenschaft Property zugeordnet ist. Bei der Suche nach einer Datei ist es die Variable FILEEXISTS1. Sie enthält entweder true oder false. Damit dürfte die Aufgabe eines Elements im Knoten Zielcomputer durchsuchen klar sein: Einer booleschen Variablen wird das Testergebnis mitgeteilt. Wie das Ergebnis jedoch ausgewertet wird, steht noch auf einem anderen Blatt. Wie am Anfang des Abschnitts bereits erläutert wurde, kann das Ergebnis dazu verwendet werden, den Installationsprozess abzubrechen, oder es wird an anderer Stelle der Installation benutzt, um fehlende Komponenten entsprechend einzurichten oder zu installieren. Ist das Vorhandensein einer Komponente von existenzieller Bedeutung, muss diese installiert werden oder die Installation muss beendet werden. Doch wie wertet man das Ergebnis der Prüfung aus und reagiert entsprechend? Dazu müssen Sie nur noch unter dem Knoten Startbedingungen einen neuen Eintrag hinzufügen. Das Ergebnis im Dialog Startbedingungen sehen Sie in Abbildung 30.19. Eine Bedingung hat drei Eigenschaften: Condition InstallUrl Message Hier klicken, um das Bild zu vergrößern Abbildung 30.19 Dialog »Startbedingungen« mit einem Eintrag zum Suchen einer Datei Im Knoten Zielcomputer durchsuchen können durchaus auch mehrere Einträge gemacht worden sein, die die Voraussetzung für das einwandfreie Laufzeitverhalten der Anwendung beschreiben. Daher muss zuerst ein Bezug zwischen dem Eintrag unter Zielcomputer durchsuchen und der hinzugefügten Bedingung hergestellt werden. Diesen Bezug stellt die Eigenschaft Condition her. In der Wertespalte im Eigenschaftsfenster muss dazu aus einer Auswahlliste die zugehörige Property ausgewählt werden (beispielsweise FILEEXISTS1). Ist der Wert der Variablen false, wird ein Meldungsfenster angezeigt, dessen Meldungstext Sie in der Eigenschaft Message festlegen. Damit der Anwender nicht im Stich gelassen wird und weiß, woher er die fehlende Datei beziehen kann, sollten Sie unter der Eigenschaft InstallUrl einen Speicherort angeben, von dem der Benutzer die Datei laden kann. Bei dem Speicherort kann es sich um eine Internetadresse, aber auch um einen Dateipfad handeln, der relativ zum Speicherort des Installationsprogramms angegeben werden muss. Weist InstallUrl einen Eintrag auf, hat der Anwender die Wahl, entweder zu der angegebenen Adresse zu navigieren oder die Installation sofort abzubrechen. Wenn Sie im Voraus wissen, dass Sie die Programminstallation nicht abbrechen wollen, wenn die Datei nicht auf dem Zielrechner installiert ist, können Sie eine Dateisuche auch ohne zusätzliche Bedingung einrichten, indem Sie die Dateisuche über das Kontextmenü des Knotens Zielcomputer durchsuchen hinzufügen. Hier klicken, um das Bild zu vergrößern Abbildung 30.20 Fehlermeldung, wenn die Suche nach einer Datei auf dem Zielrechner negativ verläuft Nehmen wir jetzt an, dass die Programminstallation nicht abgebrochen werden soll, der Installationsprozess das Ergebnis der Suche aber dahingehend auswertet, dass die Datei bei der Programminstallation auf dem Zielrechner automatisch installiert wird. Um das zu realisieren, muss die Datei dem Dateisystem-Editor hinzugefügt worden sein. Der Eigenschaft Condition der Datei teilen Sie nur noch die Bedingung mit, wann die Datei zu installieren ist. Dazu wird auch wieder die Variable FILEEXISTS1 ausgewertet:
    Condition = NOT FILEEXISTS1
Eine Aktion wird immer dann ausgeführt, wenn die Eigenschaft Condition wahr ist, also true liefert. Da FILEEXISTS1 false ist, wenn die Datei sich nicht auf dem Zielrechner befindet, müssen Sie den Inhalt der Variablen FILEEXISTS1 negieren.
Hinweis
Zur Formulierung einer Bedingung, die der Windows Installer auswerten soll, stehen neben NOT noch weitere Operatoren zur Verfügung. Beispielsweise können Sie mit den booleschen Operatoren AND und OR zwei Ausdrücke gemeinsam auswerten oder mit Vergleichsoperatoren zwei Ausdrücke miteinander vergleichen. Mehr Informationen darüber erhalten Sie in der Online-Dokumentation des Windows Installers.
#### Suche nach Registrierungseinträgen Nun wollen wir uns auch noch ansehen, wie nach einem bestimmten Eintrag in der Registrierungsdatenbank gesucht wird. Dazu bedienen wir uns eines konkreten Beispiels, mit dem Sie in der Praxis häufig konfrontiert werden. Sehr viele Anwendungen greifen auf Daten zu, die in einer Datenbank gespeichert sind. Programme mit Datenzugriff sind aber darauf angewiesen, dass auf dem Computer eine Version 2.7 oder höher von Microsoft Data Access Components (MDAC) installiert ist. Diese Komponentensoftware ist unter dem Stammschlüssel HKEY_LOCAL_MACHINE und dort unter SOFTWARE/Microsoft/DataAccess eingetragen. Damit eine Anwendung mit Datenbankzugriff ordnungsgemäß funktioniert, muss überprüft werden, ob MDAC 2.7 oder höher auf dem Zielrechner installiert ist. Die Bedingung wird im Editor für Startbedingungen formuliert, indem unter dem Knoten Anforderungen für den Zielcomputer eine Registrierungsstartkondition hinzugefügt wird. Im Knoten erscheint daraufhin ein Element, das mit Nach RegistryEntry1 suchen bezeichnet ist. Elemente, die nach einem Eintrag in der Registry suchen, weisen neben Name noch vier weitere Eigenschaften auf: Property RegKey Root Value In der Eigenschaft Root wird der Registrierungsstamm eingetragen. Im Eigenschaftsfenster wird Ihnen dazu eine Liste mit vier Konstanten eingeblendet, aus der Sie die gewünschte auswählen müssen. Wollen Sie HKEY_LOCAL_MACHINE durchsuchen, lautet die entsprechende Konstante vsdrrHKLM. Unter RegKey tragen Sie den gesuchten Registrierungsschlüssel ein. In unserem Beispiel wäre das Software\Microsoft\DataAccess. Die Eigenschaft Value beschreibt den zu suchenden Registrierungswert. Wenn Sie die Registrierungsdatenbank mit regedit.exe öffnen, werden Sie unter dem oben genannten Registrierungsschlüssel mehrere Einträge finden. Für uns ist FullInstallVer von Bedeutung ist, weil er die gesuchte Versionsnummer der auf dem Zielrechner installierten MDAC-Komponente enthält. Unter Property hat der Editor bereits eine Variable eingetragen, der das Ergebnis der Suche zugewiesen wird. Standardmäßig lautet sie für die erste Registrierungssuche REGISTRYVALUE1. Nun müssen wir noch das Suchergebnis auswerten. Dazu müssen wir nur eine entsprechende Bedingung unter dem Knoten Startbedingungen formulieren. Die Eigenschaften der Bedingung sind identisch mit denen, die Sie im vorhergehenden Abschnitt kennengelernt haben: Condition, InstallUrl und Message. Ist eine Nachinstallation erforderlich, können Sie unter InstallUrl einen Link zu der Microsoft-Website angeben. Die MDAC-Komponenten befinden sich in der Installationsdatei MDAC_typ.exe. Eine bessere Alternative ist es, diese Datei sofort auf der Installations-CD bzw. im Netzwerk zur Verfügung zu stellen. Neben einem passendem Text und der Angabe eines Pfades, über den die fehlende Komponente bezogen werden kann, muss nur noch die Bedingung, die zum Abbruch der Programminstallation führt, der Eigenschaft Condition mitgeteilt werden:
    REGISTRYVALUE1 >= "2.7"
Sie müssen berücksichtigen, dass die Startbedingung nur dann zum Abbruch führt, wenn die Auswertung von Condition das Ergebnis false liefert. #### Suche nach einer Windows-Installer-Startbedingung Die Formulierung einer Windows-Installer-Startbedingung dient der Suche nach einer Komponente, die in der Registrierungsdatenbank mit einer GUID (Globally Unique Identifier) eingetragen ist. Die GUID, eine 128-Bit-Zahl, die als Zeichenfolge beschrieben wird, muss in der Eigenschaft ComponentID eingetragen werden. Ansonsten unterscheiden sich die Suche nach der Komponente und die Auswertung des Suchergebnisses nicht von der Suche nach einer Datei oder eines Registrierungseintrags. #### Die .NET Framework-Startbedingung Die wichtigste Voraussetzung zur Installation und Ausführung eines .NET-Programms ist, dass das .NET Framework auf dem Zielcomputer vorhanden ist – natürlich in der richtigen Version. Die Common Language Runtime sowie die .NET Framework-Komponenten sind in der Datei dotnetfx.exe enthalten, die es in mehreren Sprachversionen gibt. Der Editor für Startbedingungen trägt dieser Bedingung Rechnung und fügt automatisch eine entsprechende Startbedingung hinzu, die auch nicht gelöscht werden kann. Die für die Anwendung erforderliche Version des .NET Frameworks tragen Sie in der Eigenschaft Version ein. Diese Eigenschaft muss auch zusammen mit der Eigenschaft AllowLaterVersions betrachtet werden, mit der angegeben wird, ob auch höhere Versionen von .NET Framework als die angegebene Version die Startbedingung erfüllen.