2010-03-21 2 views
5

Ich bin relativ neu in WiX. Es ist ein großartiges Werkzeug, aber ich brauche noch etwas Zeit , um es besser zu lernen. Ich habe ein Problem mit der Registrierung und Aufhebung der Registrierung einer COM Komponente festgestellt. Ich habe Installer für zwei Anwendungen erstellt, nennen wir sie A und B. Beide verwenden die gleiche COM-Komponente. Ich habe das Wärmewerkzeug, wie empfohlen. Bei der Installation von A oder B wird die Komponente ohne Probleme registriert.WIX: COM Aufhebung der Registrierung beim Entfernen eines von zwei Programmen

Aber wenn ich A und B installieren, dann entfernen A (mit Hinzufügen/Entfernen von Programmen) die COM Klasse wird nicht registriert und B kann nicht mehr verwendet werden. Gibt es eine saubere Lösung, um dies zu verhindern? Ich möchte die COM abmelden, wenn BEIDE A und B deinstalliert werden.

Jede Hilfe dankbar, würde

Mit freundlichen Grüßen, MadBadger

EDIT: Vielen Dank für Ihre Antworten. Ich setze die GUID auf den gleichen Wert in den beiden Installern und jetzt werden die Registrierungsschlüssel korrekt entfernt, dh wenn das letzte Programm aus dem System entfernt wird.
Hovewer, das Problem besteht aus einem Grund. Ich habe die Registrierung unter HKEY_CLASSES_ROOT/CLSID/[entsprechende COM GUID] überprüft. Folgendes geschieht:
- Ich installiere A und der Pfad zu COM wird auf [Pfad zu A/component.dll] gesetzt
- Ich installiere B und der Pfad zu COM wird auf [Pfad zu B/component.dll festgelegt ]
- Ich entferne B und der Pfad zu COM bleibt [Pfad zu B/component.dll]
- Jetzt kann A nicht auf die COM-Komponente zugreifen, durch die es registriert ist, da [Pfad zu B/component.dll] nicht existiert mehr

Jetzt nehme ich an, dass es obligatorisch ist, die COM-Komponente für beide Anwendungen in dasselbe Verzeichnis zu legen. Kann Windows Installer nicht zum alten Pfad zurückkehren oder fehlt mir etwas?

Antwort

4

Der Windows Installer wird dies für Sie tun, aber nur, wenn Ihr COM-Komponente hat die gleiche GUID über beide A und B, (und die DLL sind an der gleichen Stelle von beiden Anwendungen installiert.)

Der Windows-Installer funktioniert per Referenz - er zählt jede Komponente (im gesamten System). Komponenten werden anhand ihrer GUIDs identifiziert.

Wenn die COM-Komponente die gleiche GUID hat, was passiert, ist dies:

  • A installieren: Komponente refcount von 0- geht> 1, Windows Installer registriert sie
  • B installieren: Komponente refcount geht aus 1-> 2, geschieht nichts
  • Deinstallieren A: Komponente refcount aus 2- geht> 1 ist, geschieht nichts
  • Deinstallieren B: Komponente refcount aus 1- geht> 0, windows Installer deregistriert es

Wenn es nicht die gleiche GUID hat, was passiert ist, diese

  • A Installieren: Komponente A refcount von 0- geht> 1, registriert er windows installer
  • B installieren: Komponente B refcount geht von 0-> 1, Windows Installer registriert es und überschreibt Registrierungseinträge von Komponente A.
  • Deinstallieren A: Komponente Ein Refcount geht von 1-> 0, Windows Installer registriert es, Registrierungseinträge löschen.
    - Es scheint, als ob dies ist die Situation, die Sie in
  • Uninstall B sind: Komponente B refcount von 1- geht> 0, Windows Installer registriert er, Registry-Einträge zu löschen (aber sie sind bereits gelöscht)

bearbeiten Uplifted von Kommentaren:

Neben der GUID, jede Komponente hat auch einen "Key Path". Wenn die Komponente eine oder mehrere Dateien enthält, sollten Sie mithilfe von KeyPath="foo.dll" festlegen, welche Datei die "Key" -Datei ist. Wenn die Komponente einen oder mehrere Registrierungseinträge enthält, ist es ähnlich.

Wenn überprüft wird, ob etwas installiert ist, überprüft das Windows-Installationsprogramm die GUID, liest den Schlüsselpfad und überprüft dann die Datei unter dem Schlüsselpfad (so ermittelt es unter anderem, welche Version die Dinge sind) Wenn 2 Komponenten die gleiche GUID haben, müssen sie haben auch den gleichen Schlüsselpfad, die müssen an der gleichen Stelle im Dateisystem auflösen, wenn das Produkt installiert ist.

Dies ist eine langwierige Art zu sagen, beide Installer müssen die freigegebenen Dateien an der gleichen Stelle setzen. Wie für sie zu setzen, ist System32 kein guter Ort.

Ich würde vorschlagen, irgendwo unter dem Ordner gemeinsame Dateien (in der Regel Program Files\Common Files\YourCompanyName). Sie würden dies in Wix wie folgt eingeben: Directory="[CommonFilesFolder]\YourCompanyName"

+0

Sollte ich die COM-Komponente an einem Ort für beide Installer setzen? Ist der Ordner system32 ein guter Platz dafür? – madbadger

+0

Ja, du musst es an die gleiche Stelle setzen.(Das Windows-Installationsprogramm identifiziert sich mit der GUID und dem Datei-/Registrierungspfad). System32 ist kein guter Ort. Ich würde vorschlagen, irgendwo unter dem gemeinsamen Dateien-Ordner (normalerweise 'Programme \ Gemeinsame Dateien \ YourCompanyName}. Sie würden dies in Wix wie folgt eingeben: 'Directory =" [CommonFilesFolder] \ YourCompanyName "' –

+0

Vielen Dank für die Erklärung so gut! – madbadger

1

In Ihrem Component-Tag verwenden Sie die gleiche Guid in jedem Installer?

0

Sie sollten diese allgemeine Komponente im Mergemodul einschließen und von beiden Apps aus referenzieren.

Dies wird automatisch die Refcounting von Shared Dlls bei der Deinstallation machen.

Verwandte Themen