2017-07-06 149 views
0

我有一个在Visual Studio 2010中开发的应用程序,需要配置安装程序(作为.msi文件)来启动程序,然后终止任务。我在msi中有一个自定义动作来启动该程序,但我无法添加一个步骤来终止该任务。任何建议都会很棒。谢谢!配置MSI文件在安装时启动并终止程序

+0

如果您的自定义操作中的代码不起作用,那么您将显示该代码。这不是一个真正的Windows安装程序问题AFAIK。 – PhilDW

+0

没有代码,现在在提交节点上运行主输出。它后面没有自定义代码。我问是否有办法启动应用程序,然后关闭作为安装的一部分。 –

+0

如果您在“每个人”安装中启动进程作为提交自定义操作,则存在两个问题。 1)它将与系统帐户一起运行,无法访问桌面和其他用户配置文件项目,可能会失败,并且2)安装将暂停,直到过程完成。目前还不清楚在你的问题中“kill”意味着什么,因为它意味着你用你的代码启动你的程序,那为什么它不完成? – PhilDW

回答

0

您需要创建自定义操作才能处理此操作。 Windows Installer没有杀死进程事件。下面是我创建来处理这个问题的原生C++应用程序。

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