2013-08-28 14 views
1

kernel32.CreateProcessA를 사용하여 파이썬에서 프로세스를 실행하려고합니다. 내 코드는 아래에 있으며 실행중인 스크립트는 단순히 -1을 반환합니다 (따라서 Returns-1.py라는 이름). 그러나, 내가 올바른 것이라고 생각하는 방식으로 종료 코드 값에 액세스하면 0이됩니다. -1이되어야하는 반환 코드에 액세스하는 방법을 이해할 수 없습니다. 어떤 조언을 많이 주시면 감사하겠습니다.파이썬에서 종료 코드 kernel32.CreateProcessA

from ctypes import * 

HANDLE = c_void_p 
LPVOID = c_void_p 
DWORD = c_ulong 
WORD = c_ushort 
CHAR = c_char 
ULONG = c_ulong 
LPSTR = POINTER(CHAR) 
BYTE = c_char 
LPBYTE = POINTER(BYTE) 
LPDWORD = POINTER(DWORD) 

#http://msdn.microsoft.com/en-us/library/windows/desktop/ms684873(v=vs.85).aspx 
class ProcessInfo(Structure): 
    _fields_ = [('hProcess', HANDLE), 
      ('hThread', HANDLE), 
      ('dwProcessId', DWORD), 
      ('dwThreadId', DWORD), 
      ] 

#http://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx 
class StartupInfo(Structure): 
    _fields_ = [ ('cb', DWORD), 
     ('lpReserved', LPSTR), 
     ('lpDesktop', LPSTR), 
     ('lpTitle', LPSTR), 
     ('dwX', DWORD), 
     ('dwY', DWORD), 
     ('dwXSize', DWORD), 
     ('dwYSize', DWORD), 
     ('dwXCountChars', DWORD), 
     ('dwYCountChars', DWORD), 
     ('dwFillAttribute', DWORD), 
     ('dwFlags', DWORD), 
     ('wShowWindow', WORD), 
     ('cbReserved2', WORD), 
     ('lpReserved2', LPBYTE), 
     ('hStdInput', HANDLE), 
     ('hStdOutput', HANDLE), 
     ('hStdError', HANDLE), 
     ] 

class ExitCodeProcess(Structure): 
    _fields_ = [ ('hProcess', HANDLE), 
     ('lpExitCode', LPDWORD)] 

pi = ProcessInfo() 
si = StartupInfo() 
#Running cmd in a new process 
#http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx 
success = kernel32.CreateProcessA(c_char_p(0), 
           c_char_p("python Returns-1.py"), 
           0, 
           0, 
           0, 
           1, #follow forks 
           0, 
           0, 
           byref(si), 
           byref(pi)) 


#CODE TO ACCESS RETURN CODE 
c_long_p = POINTER(c_long) 
ec = ExitCodeProcess() 
success = kernel32.GetExitCodeProcess(pi.hProcess, byref(ec)) 
print "success is:", success #prints success is: 1 
print str(cast(addressof(ec.lpExitCode), c_long_p).contents) #prints 'c_long(0)' not -1 

답변

0

글쎄,이 사람은 다소 오래되었지만 대답을 찾는 사람들에게 적합합니다. 불필요한 참조 및 포인터 캐스트가 너무 많습니다. 더 쉽게하기 :

ec = DWORD() 
if not kernel32.GetExitCodeProcess(process_information.hProcess, byref(ec)): 
    print "Error in getting exit code: " + str(kernel32.GetLastError()) 
else: 
    print "Exit code: " + str(ec.value)