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 |
댓글