2017-07-06 123 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); 
} 
相關問題