2010-11-02 32 views
1

J'utilise Advanced Installer (MSI) pour installer une DLL d'extension shell pour un menu contextuel de l'explorateur. Cela fonctionne sauf sur désinstaller une action personnalisée dans InstallExecuteSequence J'ai dû ajouter une commande à regsvr32.exe/s/u afin de désenregistrer la DLL. Le problème que j'ai est que lors des réinstallations ultérieures du même produit (avec une version du produit différente et le code du produit) de sorte qu'il y ait d'abord une désinstallation automatique de l'application, parfois l'explorateur ne libère pas la DLL provoque l'affichage de la zone FilesInUse et invite à supprimer Explorer.exe ou redémarrer l'ordinateur. Comme l'extension shell n'a pas de bogue et n'a pas besoin d'être remplacée, et que je n'ai pas mis à jour son numéro de version entre les installations, je souhaite éviter de le réinstaller ou de vérifier s'il est utilisé à moins que sa version a changé.MSI InstallValidate FilesInUse hyperactive sur l'extension shell?

J'ai essayé d'ajouter une recherche du fichier MSI dans [APPDIR], mais tout ce qui revient est « C: \ » bien que le fichier est en fait quelque part ailleurs dans le dossier appdir

est-il un moyen facile ignorer la réinstallation du fichier s'il existe déjà et ignorer l'InstallValidate pour FilesInUse?

Répondre

1

Vous pouvez essayer de définir la condition de votre action personnalisée à considérer l'état du composant selon http://msdn.microsoft.com/en-us/library/windows/desktop/aa368012(v=vs.85).aspx

Puisque vous la version non mise à jour du fichier et en supposant qu'il est le keypath de composant, Windows Installer ne devrait pas essayer de réinstaller le composant. Dans ce cas, une condition comme celle-ci a une grande chance de fonctionner: $ ComponentId = 3 où ComponentId est l'identificateur du composant possédant votre extension shell. Avec cette condition, votre autorité de certification doit être exécutée uniquement lorsque le composant "ComponentId" est réellement (ré) installé.