2012-02-24 25 views
13

CreateProcess()を使用してプロセスを作成しました。これはコードです:CreateProcess()によって作成されたプロセスを終了する方法は?

STARTUPINFO si = {0}; 
PROCESS_INFORMATION pi = {0}; 
result = CreateProcess("C:\\AP\\DatabaseBase\\dbntsrv.exe", NULL, NULL, NULL, FALSE, 0, NULL, "C:\\ADP\\SQLBase", &si, &pi) 

この特定のプロセスのハンドルとprocessIdを取得するにはどうすればよいですか?そして最終的にそれを使ってこのプロセスを閉じますか?
ありがとうございます。

+0

'dbntsrv.exe'を起動すると、どのウィンドウが開きますか?それはコンソールウィンドウですか? – hmjd

+0

実際には、oracle 10gやcmdのようなコンソールウィンドウではありません。あなたはそれに入出力することはできません。これは、サーバーの起動時に開くウィンドウです。 – digvijay

+0

答えが更新されました。 – hmjd

答えて

9

typedef struct _PROCESS_INFORMATION { 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION; 

最初のパラメータは、プロセスへのハンドルです。

あなたは、プロセスを終了するには、そのハンドルを使用することができます。

BOOL WINAPI TerminateProcess(
    __in HANDLE hProcess, 
    __in UINT uExitCode 
); 

HPROCESSは
[中]プロセスへのハンドルを終了します。

ハンドルにはPROCESS_TERMINATEアクセス権が必要です。詳細については、「セキュリティとアクセス権の処理」を参照してください。この呼び出しの結果として終了したプロセスおよびスレッドによって使用される

uExitCode
[IN]終了コード。 GetExitCodeProcess関数を使用して、プロセスの終了値を取得します。 GetExitCodeThread関数を使用して、スレッドの終了値を取得します。

1

これはMSDNで完全に説明されています

結果は、(それが成功したことを意味する)ゼロでない場合、あなたがpi structureでハンドルとprocessidをを取得します。

プロセスを強制終了するためには、TerminateProcess

10

プロセスへのハンドルがPROCESS_INFORMATION構造、pi変数に返されを使用することができます。

TerminateProcess()関数を使用してプロセスを終了することができます。ただし、プロセスを強制終了する必要がある理由と、正常なシャットダウンができない理由を考慮する必要があります。あなたがCreateProcess()を呼び出す前にsicbメンバーを設定する必要が

注:

si.cb = sizeof(STARTUPINFO); 

EDIT:

コンソールウィンドウがCreateProcess()creation flag(6番目の引数)として、CREATE_NO_WINDOWを指定して抑制するためにコール。

EDIT(2):

CreateProcess()を呼び出すSTARTUPINFO構造体のメンバを以下のウィンドウトライの設定を抑制するために:

STARTUPINFO si = {0}; 
si.cb   = sizeof(STARTUPINFO); 
si.dwFlags  = STARTF_USESHOWWINDOW; 
si.wShowWindow = FALSE; 
+1

グレースフルシャットダウンの場合+1。このプロセスは、例えば、メッセージを送信します。 –

+0

それでもまだウィンドウが開きます。 – digvijay

+0

@digvijay、ウィンドウを抑制する第2のアプローチで更新された答え。それは成功しましたか? – hmjd

2
STARTUPINFOA siStartupInfo; 
PROCESS_INFORMATION piProcessInfo; 
memset(&siStartupInfo, 0, sizeof(siStartupInfo)); 
memset(&piProcessInfo, 0, sizeof(piProcessInfo)); 
siStartupInfo.cb = sizeof(siStartupInfo); 

DWORD dwExitCode = 0; 
if (CreateProcess(prgName.c_str(), 
       (LPSTR) parameters.c_str(), 
       0, 
       0, 
       false, 
       CREATE_DEFAULT_ERROR_MODE, 
       0, 
       0, 
       &siStartupInfo, 
       &piProcessInfo) != false) 
{  
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (time_in_ms)); 
} 
else 
{   
    return GetLastError(); //return error or do smething else 
} 

CloseHandle(piProcessInfo.hProcess); 
CloseHandle(piProcessInfo.hThread); 

piProcessInfo.hProcessは、プロセスのハンドルです。

WaitForSingleObject:指定されたオブジェクトがシグナル状態になるか、タイムアウト時間が経過するまで待機します。

その後(time_in_ms)プロセスは終了します。あなたが得るpi構造体で

+0

+1:これは、プロセスに少なくとも「順序付け」を終了する機会を与えます(これはTerminateProcess()ではありません)。しかし、それを説明する文章を追加したいかもしれません; –

+3

このコードは実際には子プロセスを終了させず、終了を待ちます。 –

+0

** dbntsrv.exe **は実際にはサーバーを起動しますが、このプロセスもウィンドウを開きます。このコードを試したあと、ウィンドウはそのままの状態になります。 ?? – digvijay

関連する問題