2012-02-24 43 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 2012-02-24 10:25:52

+0

這實際上並不是像oracle 10g或cmd那樣的控制檯窗口。你不能輸入/輸出它。這只是服務器啓動時打開的窗口 – digvijay 2012-02-24 10:47:13

+0

已更新的答案。 – hmjd 2012-02-24 10:54:39

回答

9

pi你得到的結構:

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 [IN]
的句柄處理將被終止。

句柄必須具有PROCESS_TERMINATE訪問權限。有關更多信息,請參閱進程安全和訪問權限。

uExitCode [IN]
退出代碼由終止這個調用的結果的過程,線程使用。使用GetExitCodeProcess函數來檢索進程的退出值。使用GetExitCodeThread函數檢索線程的退出值。

1

這在MSDN有詳盡的解釋:

如果結果不爲零(這意味着它成功了),你會得到在pi structure手柄和的ProcessID。

爲了殺死這個過程中你可以使用TerminateProcess

10

的句柄過程中PROCESS_INFORMATION結構,pi變量返回。

TerminateProcess()函數可用於終止進程。但是,您應該考慮爲什麼您需要關閉該進程以及爲什麼無法正常關機。

注意你需要調用CreateProcess()之前設置的sicb成員:

si.cb = sizeof(STARTUPINFO); 

編輯:

要取消控制檯窗口中指定CREATE_NO_WINDOW,爲creation flag(第六個參數)在CreateProcess()呼叫。

EDIT(2):

爲了抑制以下STARTUPINFO結構的成員的窗口嘗試設置主叫CreateProcess()之前:

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

適用於正常關機。該過程可以被指示通過例如關閉。發送一條消息給它。 – 2012-02-24 10:10:03

+0

它仍然打開一個窗口..這是意想不到的! – digvijay 2012-02-24 11:04:22

+0

@digvijay,用第二種方法抑制窗口更新答案。它成功了嗎? – hmjd 2012-02-24 12:42:39

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)該過程將被關閉。

+0

+1:因爲這給了進程至少一個退出「有序」的機會(這不是TerminateProcess()的作用)。但是,您可能需要添加一些解釋該文本的內容;-) – 2012-02-24 09:43:43

+3

此代碼實際上並未終止子進程,它將等待其終止。 – 2012-02-24 10:09:23

+0

** createprocess()函數中的dbntsrv.exe **實際上啓動了一個服務器,此過程也打開了一個窗口。嘗試完此代碼後,窗口保持原樣。如何關閉它打開的窗口?? – digvijay 2012-02-24 10:10:28