오늘은 서너시간 동안 변수 타입 하나 때문에 삽질을 했다…
이전에 하던 프로그램을 완성하고 새로운 프로그램을 짜고 있었는데, 아래와 같은 함수를 그대로 가져오는 과정에서 문제가 생겼다. 물론 이전에는 잘 돌아가던 코드니까 완성했겠지?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
bool GetProcessList(std::vector<std::wstring> &process_list) { HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if(snapshot == INVALID_HANDLE_VALUE) return false; boost::shared_ptr<void> snapshot_closer(snapshot, ::CloseHandle); PROCESSENTRY32W entry; entry.dwSize = sizeof(PROCESSENTRY32); if(!Process32FirstW(snapshot, &entry)) return false; do { process_list.push_back(entry.szExeFile); } while(Process32NextW(snapshot, &entry)); retrun true; } |
WinAPI를 이용해 특정 프로세스가 실행 중인지 확인하는 코드이다. 찾을 프로세스의 이름은 wstring타입으로 벡터에 들어가 있다.
1 2 |
PROCESSENTRY32W entry; entry.dwSize = sizeof(PROCESSENTRY32); |
코드의 일부이다. 위 코드의 문제는?
바로 entry의 크기에 PROCESSENTRY32를 집어넣은 것이다.
하지만 이게 100% 문제를 유발하지는 않는다. 프로젝트 설정에 유니코드(UNICODE)가 정의되어 있다면 말이다.
유니코드가 정의되어있다면 매크로에 의해 PROCESSENTRY32는 PROCESSENTRY32W로 교체된다.
만약 정의되어 있지 않다면 GetLastError()에서 24(0x18: ERROR_BAD_LENGTH)를 보낸다. 잘못된 크기가 들어갔으니까……
오후에 머리가 띵해져서 그런지 찾아도 찾아도 저건 찾아낼 수 없었다… 퇴근시간보다 1시간 더 있다가도 안보여서 이사님께(마침 이사님이 퇴근을 안하셨다) 여쭤보니 바로 찾아내셨다…….ㅠ
그러고는 이런 팁을 주셨다.
1 2 |
PROCESSENTRY32W entry; entry.dwSize = sizeof(entry); |
sizeof의 인자에 타입 그 자체를 넣지말고 변수를 넣어버리면 나중에 PROCESSENTRYW가 아닌 PROCESSENTRYA가 되어도 문제가 생기지 않을 것이다.
이렇게 금방 코드를 잡아주시고 이사님은 시크하게 손을 내저으며 “keep going”이라 하셨다…