본문 바로가기
프로그래밍/Windows

GetExitCodeProcess

by 즉흥 2014. 5. 25.
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.cpp


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가 들어갔다.


Colored By Color Scripter

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_2.cpp


위는 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

댓글