2012-02-24 17 views
13

He creado un proceso usando CreateProcess(). Este es el código:cómo finalizar un proceso creado por 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) 

¿Cómo puedo obtener el mango y processId de este proceso específico? ¿Y eventualmente usarlo para cerrar este proceso?
Gracias.

+0

¿Qué ventana se abre cuando se inicia 'dbntsrv.exe'? ¿Es una ventana de consola? – hmjd

+0

No es realmente una ventana de consola como Oracle 10g o cmd para ese asunto. No puede ingresar/sacar en él. Es solo una ventana que se abre cuando se inicia el servidor – digvijay

+0

Respuesta actualizada. – hmjd

Respuesta

9

En la estructura pi que se obtiene:

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

El primer parámetro es el identificador para el proceso.

Puede utilizar la manilla para terminar el proceso:

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

hProcess [en]
un identificador para el proceso para ser terminado.

El identificador debe tener el derecho de acceso PROCESS_TERMINATE. Para obtener más información, vea Seguridad de proceso y Derechos de acceso.

uExitCode [en]
El código de salida para ser utilizada por el proceso y los hilos terminado como resultado de esta llamada. Use la función GetExitCodeProcess para recuperar el valor de salida de un proceso. Use la función GetExitCodeThread para recuperar el valor de salida de un subproceso.

1

Esto se explica a fondo en MSDN:

Si el resultado no es cero (lo que significa que tuvo éxito) obtendrá el mango y id_de_proceso en el pi structure.

Para matar el proceso puede utilizar TerminateProcess

10

un identificador para el proceso se devuelve en la estructura PROCESS_INFORMATION, pi variable.

La función TerminateProcess() se puede utilizar para finalizar el proceso. Sin embargo, debe considerar por qué necesita matar el proceso y por qué no es posible un cierre correcto.

en cuenta que necesita para establecer el cb miembro del si antes de llamar a CreateProcess():

si.cb = sizeof(STARTUPINFO); 

EDIT:

Para suprimir la ventana de consola especifica CREATE_NO_WINDOW, como el creation flag (el sexto argumento) en el CreateProcess() llamada.

EDITAR (2):

para suprimir la configuración de la ventana siguiente intento miembros de STARTUPINFO estructura antes de llamar a CreateProcess():

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

+1 para el apagado correcto. Se puede indicar al proceso que se apague, p. Ej. enviándole un mensaje –

+0

Todavía abre una ventana ... ¡Eso fue inesperado! – digvijay

+0

@digvijay, respuesta actualizada con un segundo enfoque para suprimir la ventana. ¿Tuvo éxito? – 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 es el identificador del proceso.

WaitForSingleObject: Espera hasta que el objeto especificado se encuentre en estado señalizado o transcurra el intervalo de tiempo de espera.

Después de eso (time_in_ms) el proceso se cerrará.

+0

+1: Como esto le da al proceso al menos una oportunidad de salir de "ordenado" (que no es lo que 'TerminateProcess()' hace). Sin embargo, es posible que desee agregar un texto explicando que ;-) –

+3

Este código no termina el proceso hijo, sino que espera su finalización. –

+0

** dbntsrv.exe ** en la función createprocess() realmente inicia un servidor, este proceso también abre una ventana ... Después de probar este código, la ventana permanece como está ... ¿Cómo puedo cerrar la ventana que se abre? ?? – digvijay

Cuestiones relacionadas