2010-03-21 15 views
5

Je suis relativement nouveau à WiX. C'est un outil génial, mais j'ai encore besoin de temps pour l'apprendre mieux. J'ai rencontré un problème avec l'enregistrement et le désenregistrement d'un composant COM . J'ai créé des programmes d'installation pour deux applications, appelons-les A et B. Les deux utilisent le même composant COM. J'ai utilisé l'outil de chauffage, comme recommandé. Lors de l'installation de A ou B, le composant est enregistré sans problème . Mais quand j'installe A et B, puis retirez A (avec Ajout/Suppression de programmes) la classe COM n'est plus enregistrée et B ne peut plus l'utiliser. Existe-t-il une solution propre pour éviter que cela ne se produise? Je souhaite désinscrire le COM lorsque BOTH A et B sont désinstallés.WIX: COM désinscription lors de la suppression de l'un des deux programmes

Toute aide serait appréciée,

Meilleures salutations, madbadger

EDIT: Merci pour vos réponses. J'ai mis le GUID à la même valeur dans les deux installateurs et maintenant les clefs de registre sont enlevées correctement, c'est quand le dernier programme est enlevé du système.
Hovewer, le problème persiste pour une raison. J'ai vérifié le registre sous HKEY_CLASSES_ROOT/CLSID/[GUID COM approprié]. Voici ce qui se passe:
- J'installe A et le chemin vers COM est défini sur [chemin vers A/component.dll]
- J'installe B et le chemin vers COM est défini sur [chemin de B/component.dll ]
- Je supprime B et le chemin d'accès à COM reste [chemin d'accès à B/component.dll]
- Maintenant, A ne peut pas accéder au composant COM par le fait qu'il est enregistré, car [path to B/component.dll] n'existe pas plus maintenant

Maintenant, je suppose qu'il est obligatoire de mettre le composant COM dans le même répertoire pour les deux applications. Windows Installer ne peut-il pas revenir à l'ancien chemin ou est-ce quelque chose qui me manque?

Répondre

4

Windows Installer faire pour vous, mais seulement si votre composant COM a le même GUID sur A et B, (et les dll sont installés au même endroit par les deux applications.)

L'installateur Windows fonctionne par comptage de référence de chaque composant (sur l'ensemble du système). Les composants sont identifiés par leur GUID.

Si le composant COM a le même GUID, ce qui se passe est la suivante:

  • Installer A: Composant refcount passe de 0-> 1, Windows Installer enregistre il
  • Installer B: refcount Component va de 1-> 2, rien ne se passe
  • désinstallation A: refcount composant va de 2-> 1, rien ne se passe
  • désinstallation B: refcount composant va de 1-> 0, windows installer désenregistre il

Si elle ne possède pas le même GUID, ce qui se passe est ce

  • installer un: composant A refcount passe de 0 à> 1, Windows Installer enregistre il
  • Installer B: Composant B refcount va de 0 à> 1, le programme d'installation de Windows l'enregistre, écrasant les entrées de registre du composant A.
  • Désinstaller A: Composant Un refcount va de 1-> 0, windows installer le désinscrit, en supprimant les entrées de registre.
    - Il semble que cela est la situation que vous êtes dans
  • Désinstaller B: Composant B refcount passe de 1> 0, Windows Installer désinscrit il, la suppression des entrées de registre (mais ils sont déjà supprimés)

Modifier Uplifted des commentaires:

outre le GUID, chaque composant a également un "Key Path". Si le composant contient un ou plusieurs fichiers, vous devez définir quel fichier est le fichier "Key" en utilisant KeyPath="foo.dll". Si le composant contient une ou plusieurs entrées de registre, c'est similaire. Lorsque vous vérifiez si quelque chose est installé, le programme d'installation de Windows vérifie le GUID, lit le chemin de la clé, puis vérifie le fichier sur le chemin de la clé (c'est ainsi qu'il détermine la version, entre autres choses). Si 2 composants ont le même GUID, ils doivent doivent également avoir le même chemin de clé, qui doit doit résoudre à la même place dans le système de fichiers lorsque le produit est installé.

Il s'agit d'une manière de dire que les deux installateurs doivent placer les fichiers partagés au même endroit. Quant à savoir où les mettre, System32 n'est pas un bon endroit.

Je suggérerais quelque part sous le dossier de fichiers communs (habituellement Program Files\Common Files\YourCompanyName). Vous devez saisir ceci dans Wix comme suit: Directory="[CommonFilesFolder]\YourCompanyName"

+0

Dois-je mettre le composant COM à un emplacement pour les deux installateurs? Le dossier system32 est-il un bon endroit pour cela? – madbadger

+0

Oui, vous devez le mettre au même endroit.(Le programme d'installation de Windows s'identifie à la fois avec le GUID et le chemin du fichier/registre). System32 n'est pas un bon endroit. Je suggère quelque part sous le dossier de fichiers communs (habituellement 'Program Files \ Common Files \ YourCompanyName'). Vous entrez ceci dans Wix comme ceci: 'Directory =" [CommonFilesFolder] \ YourCompanyName "' –

+0

Merci beaucoup d'avoir bien expliqué cela! – madbadger

1

Dans votre balise Component, utilisez-vous le même Guid dans chaque programme d'installation?

0

Vous devez placer ce composant commun dans le module de fusion et le référencer à partir de vos deux applications.

Cela permettra automagiquement laisser les dlls partagés refcounting faire son travail lors de la désinstallation.