2017-07-06 6 views
0

Visual Studio 2010で開発したアプリケーションがあり、プログラムを起動してタスクを終了するには、インストーラ(.msiファイル)を構成する必要があります。 msiにプログラムを起動するカスタムアクションがありますが、タスクを終了するためのステップを追加するのに問題があります。どんな提案も素晴らしいだろう。ありがとうございました!インストール時にプログラムを起動して終了させるためのMSIファイルの設定

+0

カスタムアクションでコードが動作していない場合は、コードを表示します。それは実際にWindowsインストーラの問題AFAIKではありません。 – PhilDW

+0

コードはありませんが、コミットノードには今すぐプライマリ出力を実行しています。その背後にカスタムコードはありません。私は、アプリケーションを起動してからインストールの一部として閉じる方法があるかどうかを尋ねています。 –

+0

プロセスをEveryoneインストールでコミットカスタムアクションとして起動すると、2つの問題があります。 1)システムアカウントで実行され、デスクトップやその他のユーザープロファイル項目にアクセスできない可能性があります。2)インストールが完了するまでインストールが一時停止します。あなたのコードでプログラムを起動することを意味するので、 "kill"があなたの質問に何を意味するのかはまだ分かりません。どうして終了しないのですか? – PhilDW

答えて

0

これを処理するにはカスタムアクションを作成する必要があります。 Windowsインストーラには強制終了プロセスイベントはありません。以下は、これを処理するために作成したネイティブの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); 
} 
関連する問題