2012-02-20 3 views
10

Что такое метод получения возвращаемого значения от нереста подпроцесса в окнах? Похоже, что ShellExecute() проще в использовании, чем CreateProcess(), но из чтения, которое я сделал до сих пор, не указано, как проверить возвращаемое значение порожденного процесса. Как это делается?Как получить код возврата подпроцесса

Спасибо, Энди

ответ

18

Чтобы получить код выхода процесса на Windows, вы можете использовать GetExitCodeProcess().

Пример приложение, которое принимает идентификатор процесса в качестве аргумента и ждет в течение пяти секунд для того, чтобы завершить, а затем приобретает свой код выхода:

int main(int a_argc, char** a_argv) 
{ 
    int pid = atoi(*(a_argv + 1)); 

    HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, FALSE, pid); 

    if (NULL != h) 
    { 
     WaitForSingleObject(h, 5000); // Change to 'INFINITE' wait if req'd 
     DWORD exit_code; 
     if (FALSE == GetExitCodeProcess(h, &exit_code)) 
     { 
      std::cerr << "GetExitCodeProcess() failure: " << 
       GetLastError() << "\n"; 
     } 
     else if (STILL_ACTIVE == exit_code) 
     { 
      std::cout << "Still running\n"; 
     } 
     else 
     { 
      std::cout << "exit code=" << exit_code << "\n"; 
     } 
     CloseHandle(h); 
    } 
    else 
    { 
     std::cerr << "OpenProcess() failure: " << GetLastError() << "\n"; 
    } 

    return 0; 
} 
+3

Спасибо. Это то, что я искал. Похоже, мне нужно будет использовать CreateProcess(), чтобы начать эту вещь. Эта функция заполняет структуру PROCESS_INFORMATION, которая имеет РУЧКУ, которая мне нужна для использования с GetExitCodeProcess(). –

+0

Когда вы закончите с ручкой, не забудьте закрыть его с помощью функции «CloseHandle». –

+0

@ ЕвгенияРябцева, спасибо, я забыл добавить это. Обновлено. – hmjd

4

Вот полный код, основанный в http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx и решение hmjd :

#include <stdio.h> 
#include <Windows.h> 

int main() 
{ 
    const size_t stringSize = 1000; 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    DWORD exit_code; 
    char commandLine[stringSize] = "C:\\myDir\\someExecutable.exe param1 param2"; 
    WCHAR wCommandLine[stringSize]; 
    mbstowcs (wCommandLine, commandLine, stringSize); 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    // Start the child process. 
    if(!CreateProcess(NULL, // No module name (use command line) 
     wCommandLine, // Command line 
     NULL,   // Process handle not inheritable 
     NULL,   // Thread handle not inheritable 
     FALSE,   // Set handle inheritance to FALSE 
     0,    // No creation flags 
     NULL,   // Use parent's environment block 
     NULL,   // Use parent's starting directory 
     &si,   // Pointer to STARTUPINFO structure 
     &pi)   // Pointer to PROCESS_INFORMATION structure 
) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return -1; 
    } 

    // Wait until child process exits. 
    WaitForSingleObject(pi.hProcess, INFINITE); 

    GetExitCodeProcess(pi.hProcess, &exit_code); 

    printf("the execution of: \"%s\"\nreturns: %d\n", commandLine, exit_code); 

    // Close process and thread handles. 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
    return 0; 
} 

(работает как консольное приложение VS2005 в Windows XP)

+0

Было бы разумно добавить кавычки вокруг 0-го параметра командной строки в случае, если кто-то копирует фрагмент, помещает '... \ my dir \ ...' там. –

+0

Он работает хорошо, как есть (это доказано). Дополнительные кавычки не нужны, даже если путь содержит пробелы. И наоборот, если добавить цитаты вокруг «commandLine», «CreateProcess» не будет работать. – cesargastonec

+1

http://www.verisigninc.com/en_AU/cyber-security/security-intelligence/vulnerability-reports/articles/index.xhtml?id=340 –

Смежные вопросы