2017-07-06 4 views
0

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

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

+0

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. –

+0

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

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); 
}