728x90
    
    
  반응형
    
    
    
  | 1 2 3 4 | #include<cstdio> int main(){     return 100; } | 
a.cpp
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include<cstdio> #include<Windows.h> int main(){     STARTUPINFO si = { 0, };     PROCESS_INFORMATION pi;     DWORD ret = 0, test;     TCHAR path[] = L"a.exe";     si.cb = sizeof(si);     puts("#");     CreateProcess(NULL, path,         NULL, NULL, FALSE,         0, NULL, NULL,         &si, &pi);     CloseHandle(pi.hThread);     //WaitForSingleObject(pi.hProcess, INFINITE);     test=GetExitCodeProcess(pi.hProcess, &ret);     if (ret == STILL_ACTIVE) puts("!!");     wprintf(L"%d %d\n", ret,test);     CloseHandle(pi.hProcess);     return 0; } | 
b_1.exe의 실행 결과는 위와 같다.
a.exe가 아직 실행중이기 때문에 ret에는 STILL_ACTIVE(259)가 들어간다.
옆에 DWORD test에 GetExitCodeProcess의 반환값을 넣은 것은 잠깐 확인해볼 것이 있어서인데,
일단 GetExitCodeProcess 함수는
| BOOL WINAPI GetExitCodeProcess( _In_ HANDLE hProcess, _Out_ LPDWORD lpExitCode ); | 
이고 실패하면 0(false)을 반환하고 성공하면 1(true)을 반환한다.
만약 a.exe의 정상 반환값이 259인데, 반환값이 259인 것만 보고 STILL_ACTIVE를 판단한다면 안 된다.
그래서 STILL_ACTIVE일 때의 GetExitCodeProcess의 반환값을 알아보고자 DWORD test를 넣었다.
위에서는 GetExitCodeProcess가 제대로 실행 되었으니 test에 true가 들어가고,
a.exe가 아직 실행중이니 ret에 STILL_ACTIVE가 들어갔다.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include<cstdio> #include<Windows.h> int main(){     STARTUPINFO si = { 0, };     PROCESS_INFORMATION pi;     DWORD ret = 0, test;     TCHAR path[] = L"a.exe";     si.cb = sizeof(si);     puts("#");     CreateProcess(NULL, path,         NULL, NULL, FALSE,         0, NULL, NULL,         &si, &pi);     CloseHandle(pi.hThread);     WaitForSingleObject(pi.hProcess, INFINITE);     test=GetExitCodeProcess(pi.hProcess, &ret);     if (ret == STILL_ACTIVE) puts("!!");     wprintf(L"%d %d\n", ret,test);     CloseHandle(pi.hProcess);     return 0; } | 
위는 WaitForSingleObject 함수를 이용해서 a.exe의 실행이 완전이 종료될 때까지 기다렸을 때의 결과이다.
ret에는 STILL_ACTIVE 대신에 a.exe의 반환값이 들어갔다.
a.cpp의 코드를 다음과 같이 수정해보았다.
| 1 2 3 4 | #include<cstdio> int main(){     return 259; } | 
b_1.cpp의 코드든, b_2.cpp의 코드든 실행 결과는 위와 같다.
시발. 존나 답답하다.
a.exe의 반환값이 259여도 STILL_ACTIVE라 판단함.
좆같다. 답답.
STILL_ACTIVE이면 반환값이 false(0)이고 ret에 259가 들어가고,
STILL_ACTIVE가 아니면 반환값이 true(1)고 ret에 259가 들어갈 줄 알았는데 아니다.
음.. 시발 일단 이런 결론을 내려본다.
프로세스가 정상적으로 종료되었던 아니던 간에, ret의 값이 259인 이상 STILL_ACTIVE라고 판단하는건 당연하다.
왜냐하면 STILL_ACTIVE의 값이 259라고 정의되어 있으니까.
GetExitCodeProcess 함수 자체가 사실, 대체로 프로세스의 종료 원인을 알고자 할 때 쓰인다고 한다.
한 프로세스를 종료시키면서 259라는 값을 얻고자 한다면 IPC를 통해 하고, 반환은 다른 것으로 하자.
끝.
728x90
    
    
  반응형
    
    
    
  '프로그래밍 > Windows' 카테고리의 다른 글
| process list 출력 (2) | 2015.05.20 | 
|---|---|
| how to create ListView on Visual C++ (0) | 2015.05.20 | 
| 사용자 입력 글자수 제한하기 (0) | 2014.07.04 | 
| C++ WinForm Frame (0) | 2014.07.04 | 
| 쓰레드 동기화와 WAIT_ABANDONED (7) | 2014.06.02 | 
| (싱글 더블 와이드) 함수 정리 (0) | 2014.05.25 | 
| IPC MailSlot 메일 슬롯 (0) | 2014.05.25 | 
| tchar.h (1) | 2014.05.13 | 
| 사용자 정의 에러 함수 _invalid_parameter_handler (0) | 2014.05.01 | 
| 안전 문자열 함수 _tcscpy_s (0) | 2014.04.30 | 
댓글