지인이 요청하길, 도저히 실행 에러가 뜰수 없는 코드인데도 불구하고, 실행시 에러가 발생하기에, 그 원인을 분석해 달라고 했다. 아래는 지인이 준 소스 중에서, 그 유명한 엑세사리 바이올린이 떠는 소스 부분이다.
var
ExeName: String;
begin
// ShellExecute에서 호출할 외부 실행 파일명 얻기
ExeName:= ExtractFilePath(ParamStr(0)) + 'Project2.exe';
// 문제의 실행에러 라인
ShellExecute(0, 'Open', PChar(ExeName), PChar('1'), nil, SW_SHOW);
end;
이 프라젝트와 동일한 폴더에 Project2.exe가 존재하며, 이 실행 파일은 단독으로는 너무도 잘 실행된다. 다시말해서 Project2.exe는 아무런 문제도 없다는 것이다. Project2.exe는 델파이에서 새로운 프라젝트를 생성하면 기본으로 만들어지는 빈폼 하나 달랑있는 실행 파일일 뿐이다.
따라서, ShellExecute 실행 라인에서 Project2.exe는 원인이 아니다. 그렇다면 ShellExecute의 어떤 부분에서 에러가 발생한 것일까? 이 소스를 컴파일해보면 어떤 경고도 떨어지지 않는다. 그러나 실행시 엑세사리 바이올린이 연주를 하는 걸로 봐서는 분명히 뭔가 잘못된 부분이 있다. 즉 델파이 컴파일러조차도 감지 못했던 미묘한 버그가 있다는 것이다.
그 버그는 대체 무엇이겠는가? 볼포 여러분들은 어떻게 생각하시는가? 이 버그를 찾아내면서 델파이 컴파일러가 이런 경우에 왜 경고를 때리지 않는지 참으로 안타까울 뿐이다.
|
1바이트 문자열은 넘길 때 주의해야 겠네요.