2012-02-24 11 views
13

Ho creato un processo utilizzando CreateProcess(). Questo è il codice:come terminare un processo creato da 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) 

Come posso ottenere l'handle e l'ID di processo di questo processo specifico? E alla fine usarlo per chiudere questo processo?
Grazie.

+0

Quale finestra viene aperta all'avvio di 'dbntsrv.exe'? È una finestra di console? – hmjd

+0

In realtà non è una finestra di console come oracle 10g o cmd. Non puoi inserire/emettere su di esso. È solo una finestra che si apre all'avvio del server – digvijay

+0

Risposta aggiornata. – hmjd

risposta

9

Nella struct pi si ottiene:

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

Il primo parametro è la maniglia per il processo.

È possibile utilizzare l'impugnatura per terminare il processo:

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

hProcess [in]
da terminare un handle per il processo.

L'handle deve disporre del diritto di accesso PROCESS_TERMINATE. Per ulteriori informazioni, vedere Sicurezza dei processi e diritti di accesso.

uExitCode [a]
Il codice di uscita da utilizzare per il processo ei filati terminato come risultato di questa chiamata. Utilizzare la funzione GetExitCodeProcess per recuperare il valore di uscita di un processo. Utilizzare la funzione GetExitCodeThread per recuperare il valore di uscita di un thread.

1

questo è spiegato a fondo nella MSDN:

Se il risultato è diverso da zero (il che significa che è riuscita) si otterrà la maniglia e processid nel pi structure.

Al fine di uccidere il processo è possibile utilizzare TerminateProcess

10

un handle per il processo viene restituito nella PROCESS_INFORMATION struttura, pi variabile.

La funzione TerminateProcess() può essere utilizzata per terminare il processo. Tuttavia, dovresti considerare il motivo per cui devi uccidere il processo e perché non è possibile eseguire uno spegnimento regolare.

Nota è necessario impostare la cb membro del si prima di chiamare CreateProcess():

si.cb = sizeof(STARTUPINFO); 

EDIT:

Per sopprimere la finestra della console specificare CREATE_NO_WINDOW, come il creation flag (il sesto argomento) nella CreateProcess() chiamata.

EDIT (2):

Per sopprimere l'impostazione finestra tentativo successivo membri STARTUPINFO struttura prima di chiamare CreateProcess():

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

+1 per lo spegnimento regolare. Il processo può essere istruito allo spegnimento ad es. inviando un messaggio ad esso. –

+0

Apre ancora una finestra .. Questo è stato inaspettato !! – digvijay

+0

@digvijay, risposta aggiornata con secondo approccio alla finestra di soppressione. Ci è riuscito? – 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 è il manico del processo.

WaitForSingleObject: attende finché l'oggetto specificato non si trova nello stato segnalato o l'intervallo di timeout è scaduto.

Successivamente (time_in_ms) il processo verrà chiuso.

+0

+1: Dato che questo dà al processo almeno la possibilità di uscire "ordinato" (che non è ciò che fa "TerminateProcess()"). Tuttavia, potresti voler aggiungere del testo che lo spieghi ;-) –

+3

Questo codice in realtà non termina il processo figlio, attende la sua chiusura. –

+0

** dbntsrv.exe ** nella funzione createprocess() avvia effettivamente un server, questo processo apre anche una finestra .. Dopo aver provato questo codice la finestra rimane così com'è .. Come posso chiudere la finestra che apre ?? – digvijay

Problemi correlati