2012-02-24 38 views
13

Tôi đã tạo quy trình sử dụng CreateProcess(). Đây là mã:làm thế nào để chấm dứt một quá trình được tạo ra bởi 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) 

Làm cách nào để có thể xử lý và xử lý quá trình cụ thể này? Và cuối cùng sử dụng nó để đóng quá trình này?
Cảm ơn bạn.

+0

Cửa sổ nào được mở khi bạn khởi động 'dbntsrv.exe'? Nó là một cửa sổ giao diện điều khiển? – hmjd

+0

Nó không thực sự là một cửa sổ giao diện điều khiển như oracle 10g hoặc cmd cho rằng vấn đề. Bạn không thể nhập/xuất trên đó. Nó chỉ là một cửa sổ mở ra khi máy chủ được bắt đầu – digvijay

+0

câu trả lời được cập nhật. – hmjd

Trả lời

9

Trong struct pi bạn nhận được:

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

Tham số đầu tiên là xử lý để quá trình này.

Bạn có thể sử dụng tay cầm đó để kết thúc quá trình:

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

hProcess [trong]
Một handle quá trình được chấm dứt.

Tay cầm phải có quyền truy cập PROCESS_TERMINATE. Để biết thêm thông tin, hãy xem Xử lý bảo mật và quyền truy cập.

uExitCode [in]
Mã thoát được sử dụng bởi quy trình và chủ đề được chấm dứt do cuộc gọi này sử dụng. Sử dụng hàm GetExitCodeProcess để truy xuất giá trị thoát của quá trình. Sử dụng hàm GetExitCodeThread để lấy giá trị thoát của một chuỗi.

1

này được giải thích kỹ lưỡng trong MSDN:

Nếu kết quả không phải là zero (có nghĩa là nó đã thành công), bạn sẽ có được xử lý và ProcessID trong pi structure.

Để giết chết quá trình, bạn có thể sử dụng TerminateProcess

10

Một handle quá trình này sẽ được trả về trong PROCESS_INFORMATION cấu trúc, pi biến.

Có thể sử dụng chức năng TerminateProcess() để chấm dứt quá trình. Tuy nhiên, bạn nên xem xét lý do tại sao bạn cần phải giết quá trình và tại sao một tắt máy duyên dáng là không thể.

Lưu ý bạn cần phải thiết lập các cb viên của si trước khi gọi CreateProcess():

si.cb = sizeof(STARTUPINFO); 

EDIT:

Để ngăn chặn các cửa sổ giao diện điều khiển xác định CREATE_NO_WINDOW, như creation flag (đối số thứ sáu) trong CreateProcess() gọi điện.

EDIT (2):

Để ngăn chặn các thiết lập cửa sổ thử thành viên của STARTUPINFO cấu trúc sau đây trước khi gọi CreateProcess():

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

+1 để tắt máy một cách duyên dáng. Quá trình có thể được hướng dẫn tắt máy bằng cách, ví dụ: gửi tin nhắn cho nó. –

+0

Nó vẫn mở ra một cửa sổ .. Đó là điều bất ngờ !! – digvijay

+0

@digvijay, câu trả lời được cập nhật với cách tiếp cận thứ hai để chặn cửa sổ. Nó có thành công không? – 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 là handle của quá trình.

WaitForSingleObject: Chờ cho đến khi đối tượng được chỉ định ở trạng thái được báo hiệu hoặc khoảng thời gian chờ hết hạn.

Sau đó (time_in_ms) quy trình sẽ bị đóng.

+0

+1: Vì điều này mang lại cho quá trình ít nhất một cơ hội để thoát khỏi "trật tự" (mà không phải là những gì 'TerminateProcess()' nào). Tuy nhiên, bạn có thể muốn thêm một số văn bản giải thích rằng ;-) –

+3

Mã này không thực sự chấm dứt quá trình con, nó chờ kết thúc của nó. –

+0

** dbntsrv.exe ** trong hàm createprocess() thực sự bắt đầu một máy chủ, quá trình này cũng mở ra một cửa sổ .. Sau khi thử mã này, cửa sổ vẫn giữ nguyên .. Làm thế nào tôi có thể đóng cửa sổ mà nó mở ra ?? – digvijay

Các vấn đề liên quan