Laden...

WiX - Uninstall - Config nur bei Bestätigung einer Benachrichtigung entfernen

Erstellt von Gnozo vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.340 Views
G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren
WiX - Uninstall - Config nur bei Bestätigung einer Benachrichtigung entfernen

Hallo Forum,

Ich beschäftige mich gerade mit dem Windows Installer XML Toolset und hänge seit geraumer Zeit an einem kleinem Problem.

Bei der Installation meines Programmes wird auch eine Config.xml installiert, welche danach von dem Benutzer auf seine Vorlieben geändert wird.

Das diese Config.xml bei einem Upgrade nur auf Wunsch des Benutzers überschrieben wird, habe ich schon eingebaut, jetzt hapert es aber bei der Deinstallation.

Ich möchte gerne eine Messagebox anzeigen lassen, welche den Benutzer fragt ob er seine Config.xml auch deinstallieren möchte.
Bei der Auswahl von "Ja" wird sie samt den anderes Dateien mit entfernt. Bei "Nein" soll sie dort bleiben, wo sie liegt und nicht deinstalliert werden.

Wenn hier ein WiX-Erfahrener ist, der mir bei meinem Problem zu helfen weiß, wäre das super 😃

Gruß
Lukas

3.511 Beiträge seit 2005
vor 10 Jahren

Hallo,

dazu musst du die Datei in eine eigene Component legen und dann per Condition abfragen, ob diese auch wirklich entfernt werden soll.


<Component Id="removeFile" Guid="*">
  <RemoveFile Id="remove" Name="my.config" On="uninstall"/>
  <Condition>(WIRKLICHLOESCHEN = 1)</Condition>
</Component>

Die Variable "WirklichLoeschen" muss dann in einem eigenen Dialog natürlich per CheckBox ausgewertet werden.

Aber so in etwa funktioniert das dann.

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Ist dies auch Möglich, wenn ich die MondoUI verwende?

Ich habe schon mehrere Anleitungen gesehen, wie man in die BuildIn-UI´s seine eigenen Dialoge einbinden kann, jedoch fand ich das alles sehr aufwändig, weil es immer darum ging einen ganzen Dialog einzubinden.

Ich möchte ja einfach am Anfang der Deinstallation ein kleines Fenster wie in C# (MessageBox.Show)anzeigen lasen und den Wert der Benutzereingabe dann der "WirklichLoeschen" variable hinzuweisen.

Soweit wie ich mich durch die Foren gewühlt habe bietet WiX leider keine deartige Funktion.

Außer <Condition Message="" </Condition>, welche aber das Setup komplett abbricht.

3.511 Beiträge seit 2005
vor 10 Jahren

Moin,

eigene Dialoge kannst du auch bei der MondoUI verwenden (mach ich z.B. auch so).

Eine eigene MessageBox könntest du via einer CustomAction bereitstellen. ABER: Der Sinn bei MSIs ist es, dass alles im Context des MSIs läuft und keine Benutzereingaben von "ausserhalb" stattfinden sollen. Ein MSI sollte auch immer im Silent Modus laufen, was bei einer MessageBox dann nicht mehr funktioniert.

Schnapp dir am besten die Sourcen von WiX und schau dir an, wie die MondoUI aufgebaut ist (ist alles in den Verezeichnissen zu finden). Dann baust du dir einen eigenen kleinen Dialog (Vorlagen hast du dann ja genug) und setzt den ein. Das ist kein Hexenwerk und leicht verständlich.

Von einer MessageBox würde ich definitiv abraten.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Hallo Khalid,

Ich habe diese Schritte jetzt befolgt und habe mit diesem Tutorial ebenfalls gearbeitet:
http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/

Ich habe jetzt eine CheckBox zu dem MaintenanceTypeDlg hinzugefügt


<Control Type="CheckBox" Id="UnInstallConfig" Width="205" Height="17" X="45" Y="210" Text="Remove Config file?" Property="UNINSTALLCONFIG" CheckBoxValue="1" />

Dann habe ich noch die Referenz in der wixUI_Mondo auf meinen geänderten Dialog gelegt und beide in mein Projekt eingebunden.

Wenn ich das Projekt nun kompiliere zeigt mir der Compiler diesen Fehler an:> Fehlermeldung:

ICE17: PushButton: 'Back' of Dialog: 'MaintenanceTypeDlg' does not have an event defined in the ControlEvent table. It is a 'Do Nothing' button.

Ich habe an diesem Button selber nichts geändert und Ihn auch mit anderen Buttons aus anderen Dialogs verglichen und keine Unterschiede festgestellt.
Wenn ich den Installer, der daraus entstanden ist, benutze, wird mir leider meine Checkbox nicht angezeigt und die Buttons "Remove,Repair,Add" funktionen auch nicht mehr. Also ich kann drauf klicken ohne das sich etwas tut.

Ich weiß jetzt leider nicht, wie ich weiter komme. Hattest du vielleicht mal mit einem ähnlichem Problem zu kämpfen und kannst mir einen Lösungsvorschlag machen?

EDIT: Man muss auch alle "MaintenanceTypeDlg" in seiner eigenen WixUI_Mondo.wxs auf seinen eigenen "MyMaintenanceTypeDlg" abändern.....

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Hallo,

Also ich konnte den Dialog jetzt einbinden und kann die CheckBox auch setzen, nur leider deinstalliert er die Config.xml einfach nicht.
Ich weiß nicht genau, wo ich das RemoveFile einbinden soll.

Bis jetzt hab ich es in meinem <Directory> Block, wo auch die Dateien zur Installation verzeichnet sind:


<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
	<Product Id="*"
           Name="MyTestProgram"
           Language="1033" Version="1.0.0.0"
           Manufacturer="MyManufacturer"
           UpgradeCode="4591d04d-83e2-4ef5-994c-ab4a3fe3cd03">
    
    	<Package Compressed="yes"
             InstallerVersion="301"
             Manufacturer="MyManufacturer"
             Description="Install My Program"
             Keywords="Testing"
             Comments="(c) MyManufacturer" />

	<UIRef Id="MyWixUI_Mondo" />
	<UIRef Id="WixUI_ErrorProgressText" />
	<Property Id="UNINSTALLCONFIG" Secure="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="CompanyFolder" Name="MyCompany">
          <Directory Id="APPLICATIONROOTDIRECTORY" Name="MyProgram">
            <Directory Id="CONFIGFOLDER" Name="Config">
              <Component Id="Config" Guid="{00415BB8-ADA4-4FB1-BC7E-54DBC915906A}">
                <File Id="Configuration.xml" Name="Configuration.xml" Source="$(var.PathToFile)\Default_Configuration.xml" Vital="yes" KeyPath="no" DiskId="1" />
              </Component>
              <Component Id="RemoveConfig" Guid="09BF5E79-CF7A-4890-B4ED-5C92E202F5F7">
                <RemoveFile Id="Config" Name="Configuration.xml" On="uninstall"/>
                <Condition>UNINSTALLCONFIG</Condition>
              </Component>
            </Directory>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id='Config' Title='!(loc.ConfigComponentName)' Description='!(loc.ConfigComponentDesc)' Display='expand' Level='2' ConfigurableDirectory='APPLICATIONROOTDIRECTORY'>
      <ComponentRef Id="Config" />
      <ComponentRef Id="RemoveConfig" />
    </Feature>

  </Product>
</Wix>


Hab ich den Block falsch platziert? Ich weiß leider nicht weiter.

Gruß
Lukas

R
12 Beiträge seit 2013
vor 10 Jahren

Hallo,

ich hatte vor kurzen auch das Problem, dass sich etwas nicht deinstalieren ließ.
Ursache war die Guid der Komponente.
Ich hatte ein wiederverwendbares Grundgerüst der wxs-Datei benutzt, aber nicht alle enthaltenen Guid's geändert. Könnte dies bei dir auch so sein?

Gruß RX8

G
Gnozo Themenstarter:in
141 Beiträge seit 2011
vor 10 Jahren

Naja ich will ja, dass der Benutzer die Wahl hat die Config deinstallieren zu lassen oder nicht.

Leider wird die Verwendete Property nicht in dem Dialog ausgewertet.