2010-07-21 9 views
3

Je voudrais ajouter un bouton "Désinstaller" à mon programme qui lancera le programme de désinstallation pour supprimer le programme, puis quitter immédiatement. Quelle est la meilleure façon de a) déterminer s'il y a un désinstallateur présent, et b) trouver le programme de désinstallation correct et le lancer? Puis-je utiliser le registre de manière fiable? Je me souviens avoir utilisé le registre avant de réparer quelques installations cassées et pensais que je pourrais parcourir les entrées et identifier le bon, mais je crains que l'utilisation du registre ne soit pas fiable et/ou fonctionne sur tous les systèmes?Démarrage d'un programme de désinstallation à partir du code

Une autre idée est que je pourrais effectivement stocker les informations de désinstallation dans le registre pendant l'installation elle-même, puis utiliser ces informations pour trouver le programme de désinstallation correct. Cela semble être la méthode la plus fiable, mais existe-t-il un tel identifiant que je pourrais stocker pour pouvoir ensuite revenir à Windows Installer?

+0

Votre programme est-il installé via un MSI créé avec un projet d'installation de Visual Studio? –

+1

Vous ne savez pas si votre * programme * possède un programme de désinstallation? Inhabituel. –

+0

@Hans: Permettez-moi de clarifier: Le programme est installable en option, mais également disponible sous forme de fichier .exe portable dans un fichier zip. Par conséquent, il n'y a aucune garantie qu'il sera nécessairement * être * installé. En ce qui concerne le MSI, j'utilise WiX pour l'écrire. – devios1

Répondre

3

Puisque vous l'avez fait avec Windows Installer, je suppose que vous distribuez votre application en utilisant un MSI. Cela dit, vous pouvez appeler msiexec/x {ProductCode} à partir de votre application pour initialiser la désinstallation. Vous pouvez obtenir le code du produit en demandant au programme d'installation d'écrire dans une clé/valeur de registre que votre application peut lire ou de coder en dur le code ou le code de mise à niveau dans votre application. Si vous codez le UpgradeCode, vous devrez appeler l'API Windows Installer pour trouver le ProductCode installé pour ce UpgradeCode.

+0

Cool, ça sonne à peu près ce dont j'ai besoin. – devios1

+0

Vous devez utiliser l'assembly Microsoft.Deployment.WindowsInstaller trouvé dans le répertoire SDK de WiX. Jetez un coup d'œil au fichier d'aide fourni pour le membre ProductInstallation :: GetRelatedProducts (chaîne UpgradeCode). Cela retournera un IEnumeratble qui a un getter pour ProductCode. Si vous ne voulez pas inclure cet assemblage dans votre application, vous devrez écrire vos propres P/Invokes pour MSI. MsiEnumRelatedProducts est ce dont vous aurez besoin de msi.dll. Jetez un oeil à: codeproject.com/KB/cs/msiinterop.aspx Personnellement, j'aime DTF. –

+0

Mon idée était de simplement stocker {ProductCode} à une clé de registre lors de l'installation, puis vérifier si cette clé existe dans le programme, en appelant msiexec/x {ProductCode} si c'est le cas. Ai-je vraiment besoin d'accéder à MSI par programmation? Aussi qu'est-ce que DTF? – devios1

Questions connexes