J'ai une application que j'ai développée dans Visual Studio 2010 et j'ai besoin de configurer le programme d'installation (en tant que fichier .msi) pour lancer le programme et ensuite tuer la tâche. J'ai une action personnalisée dans le msi pour lancer le programme, mais j'ai du mal à ajouter une étape pour tuer la tâche aussi bien. Toute suggestion sera appréciée. Je vous remercie!Configuration d'un fichier MSI pour lancer et supprimer un programme lors de l'installation
0
A
Répondre
0
Vous devrez créer une action personnalisée pour gérer cela. Windows Installer n'a pas d'événement de processus kill. Voici une application C++ native que j'ai créée pour gérer cela.
// KillProc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <algorithm>
#include <string>
BOOL KillProcess(_TCHAR* szProcessToKill);
TCHAR* AcTcharlower(TCHAR *pString);
int _tmain(int argc, _TCHAR* argv[])
{
if(argc > 1){
KillProcess(argv[1]);
}else{
// No Process found
}
return 0;
}
BOOL KillProcess(_TCHAR* szProcessToKill){
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 processEntry32;
LPWSTR lpszBuffer = new TCHAR[MAX_PATH];
LPWSTR lpszProcessToKill = new TCHAR[MAX_PATH];
lpszProcessToKill = AcTcharlower(szProcessToKill);
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Takes a snapshot of all the processes
if(hProcessSnap == INVALID_HANDLE_VALUE){
return(FALSE);
}
processEntry32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnap, &processEntry32))
{
CloseHandle(hProcessSnap);
return(FALSE);
}
do
{
lpszBuffer = processEntry32.szExeFile;
if(!wcsicmp(lpszBuffer,szProcessToKill)){ // Is this our Process
hProcess = OpenProcess(PROCESS_TERMINATE,0, processEntry32.th32ProcessID); // It is so get the process handle
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}
}while(Process32Next(hProcessSnap,&processEntry32)); // gets next member of snapshot
CloseHandle(hProcessSnap); // closes the snapshot handle
return(TRUE);
}
TCHAR* AcTcharlower(TCHAR *pString)
{
static TCHAR pBuffer[MAX_PATH];
TCHAR *s = pString;
TCHAR *t = pBuffer;
while (*s != '\0')
{
*t = tolower(*s);
s++;
t++;
}
return(pBuffer);
}
Si vous avez du code dans votre action personnalisée qui ne fonctionne pas, alors vous affichez le code. Ce n'est pas vraiment un problème d'installation de Windows AFAIK. – PhilDW
Il n'y a pas de code, sur le noeud de validation en ce moment je l'ai en cours d'exécution sur la sortie principale. Pas de code personnalisé derrière. Je demande s'il existe un moyen de lancer l'application puis de la fermer dans le cadre de l'installation. –
Si vous lancez le processus en tant qu'action personnalisée de validation dans une installation Tout le monde, il y a deux problèmes. 1) Il fonctionnera avec le compte système et sera incapable d'accéder au bureau et à d'autres éléments du profil utilisateur, éventuellement en cas d'échec et 2) L'installation s'arrêtera jusqu'à ce que le processus se termine. Je ne comprends toujours pas ce que signifie «tuer» dans votre question, car cela implique que vous lancez votre programme avec votre code, alors pourquoi ne le termine-t-il pas? – PhilDW