오늘은 서너시간 동안 변수 타입 하나 때문에 삽질을 했다…

이전에 하던 프로그램을 완성하고 새로운 프로그램을 짜고 있었는데, 아래와 같은 함수를 그대로 가져오는 과정에서 문제가 생겼다. 물론 이전에는 잘 돌아가던 코드니까 완성했겠지?

WinAPI를 이용해 특정 프로세스가 실행 중인지 확인하는 코드이다. 찾을 프로세스의 이름은 wstring타입으로 벡터에 들어가 있다.

코드의 일부이다. 위 코드의 문제는?

 

바로 entry의 크기에 PROCESSENTRY32를 집어넣은 것이다.

하지만 이게 100% 문제를 유발하지는 않는다. 프로젝트 설정에 유니코드(UNICODE)가 정의되어 있다면 말이다.

유니코드가 정의되어있다면 매크로에 의해 PROCESSENTRY32는 PROCESSENTRY32W로 교체된다.

만약 정의되어 있지 않다면 GetLastError()에서 24(0x18: ERROR_BAD_LENGTH)를 보낸다. 잘못된 크기가 들어갔으니까……

 

오후에 머리가 띵해져서 그런지 찾아도 찾아도 저건 찾아낼 수 없었다… 퇴근시간보다 1시간 더 있다가도 안보여서 이사님께(마침 이사님이 퇴근을 안하셨다) 여쭤보니 바로 찾아내셨다…….ㅠ

그러고는 이런 팁을 주셨다.

sizeof의 인자에 타입 그 자체를 넣지말고 변수를 넣어버리면 나중에 PROCESSENTRYW가 아닌 PROCESSENTRYA가 되어도 문제가 생기지 않을 것이다.

이렇게 금방 코드를 잡아주시고 이사님은 시크하게 손을 내저으며 “keep going”이라 하셨다…

 

2200001.emot_0212200001.emot_026 2200001.emot_061

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.