2012-02-20 14 views
10

विंडोज़ के भीतर उप-प्रक्रिया को उत्पन्न करने से वापसी मूल्य प्राप्त करने का तरीका क्या है? ऐसा लगता है कि ShellExecute()CreateProcess() की तुलना में उपयोग करने में आसान है, लेकिन पढ़ने से मैंने अब तक ऐसा किया है, न ही संकेत दिया है कि स्पॉन्डेड प्रक्रिया के वापसी मूल्य को कैसे जांचें। यह कैसे किया जाता है?उप-प्रक्रिया कैसे प्राप्त करें 'वापसी कोड

धन्यवाद, एंडी

उत्तर

18

विंडोज पर एक प्रक्रिया आप 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

धन्यवाद (Windows XP में VS2005 सांत्वना आवेदन के रूप में रन)। यह वही है जिसे मैं देख रहा था। ऐसा लगता है कि मुझे इस चीज़ को शुरू करने के लिए CreateProcess() का उपयोग करना होगा। वह फ़ंक्शन एक PROCESS_INFORMATION संरचना भरता है जिसमें हैंडल मुझे GetExitCodeProcess() के साथ उपयोग करने की आवश्यकता है। –

+0

जब आप हैंडल के साथ समाप्त हो जाते हैं, तो 'CloseHandle' फ़ंक्शन का उपयोग करके इसे बंद करना सुनिश्चित करें। –

+0

@EugeneRyabtsev, धन्यवाद, मैं इसे जोड़ना भूल गया। अपडेट किया गया। – 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; 
} 

+0

अगर किसी ने स्निपेट की प्रतिलिपि बनाई है तो 0 वें कमांड लाइन पैरामीटर के आसपास उद्धरण जोड़ने के लिए समझदारी होगी ... \ my dir \ ... 'वहां। –

+0

यह अच्छी तरह से काम करता है (यह साबित हुआ है)। पथ में रिक्त स्थान होने पर भी कोई अतिरिक्त उद्धरण आवश्यक नहीं है। इसके विपरीत, यदि "कमांडलाइन" के आसपास उद्धरण जोड़े गए हैं, तो "CreateProcess" काम नहीं करेगा। – cesargastonec

+1

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

संबंधित मुद्दे