2017-07-06 2 views
0

Ich habe eine Anwendung, die ich in Visual Studio 2010 entwickelt habe und das Installationsprogramm (als MSI-Datei) konfigurieren muss, um das Programm zu starten und dann die Aufgabe zu beenden. Ich habe eine benutzerdefinierte Aktion in der MSI, um das Programm zu starten, aber ich habe Schwierigkeiten, einen Schritt hinzuzufügen, um die Aufgabe auch zu töten. Irgendwelche Vorschläge wären großartig. Vielen Dank!Konfigurieren einer MSI-Datei zum Starten und Beenden eines Programms bei der Installation

+0

Wenn Sie in Ihrer benutzerdefinierten Aktion Code haben, der nicht funktioniert, zeigen Sie den Code an. Das ist nicht wirklich ein Windows Installer Problem AFAIK. – PhilDW

+0

Es gibt keinen Code, auf dem Commit-Knoten habe ich jetzt den primären Ausgang. Kein benutzerdefinierter Code dahinter. Ich frage, ob es eine Möglichkeit gibt, die Anwendung starten zu lassen und dann als Teil der Installation zu schließen. –

+0

Wenn Sie den Prozess als benutzerdefinierte Commitaktion in einer Everyone-Installation starten, gibt es zwei Probleme. 1) Es wird mit dem Systemkonto ausgeführt und kann nicht auf den Desktop und andere Benutzerprofilelemente zugreifen, was möglicherweise fehlschlägt und 2) Die Installation wird angehalten, bis der Prozess abgeschlossen ist. Es ist mir immer noch nicht klar, was "kill" in deiner Frage bedeutet, weil es bedeutet, dass du dein Programm mit deinem Code startest, also warum endet es nicht einfach? – PhilDW

Antwort

0

Sie müssen eine benutzerdefinierte Aktion erstellen, um damit umzugehen. Windows Installer verfügt nicht über ein Killprozess-Ereignis. Unten ist eine native C++ App, die ich erstellt habe, um damit umzugehen.

// 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); 
} 
Verwandte Themen