C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[13056] 알쏭달쏭한 오브젝트 파스칼 문제
주정섭 [jjsverylong] 3013 읽음    2007-06-05 10:37
지인이 요청하길, 도저히 실행 에러가 뜰수 없는 코드인데도 불구하고, 실행시 에러가 발생하기에, 그 원인을 분석해 달라고 했다. 아래는 지인이 준 소스 중에서, 그 유명한 엑세사리 바이올린이 떠는 소스 부분이다.

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의 어떤 부분에서 에러가 발생한 것일까? 이 소스를 컴파일해보면 어떤 경고도 떨어지지 않는다. 그러나 실행시 엑세사리 바이올린이 연주를 하는 걸로 봐서는 분명히 뭔가 잘못된 부분이 있다. 즉 델파이 컴파일러조차도 감지 못했던 미묘한 버그가 있다는 것이다.

그 버그는 대체 무엇이겠는가? 볼포 여러분들은 어떻게 생각하시는가? 이 버그를 찾아내면서 델파이 컴파일러가 이런 경우에 왜 경고를 때리지 않는지 참으로 안타까울 뿐이다.
김도완 [purplecofe2]   2007-06-05 11:19 X
pchar('1')이 잘못 해석되어 31이 바로 스택에 푸쉬되는 것 뿐이네요. 31을 그냥 ordinary로 인식하고 강제 캐스팅으로 값이 전환되어 푸쉬되는 것 같네요. 간단히 포인터 $31로 값이 전달된다는 것이죠. 정확히 컴파일러 문제이겠지만, 언어적인 특성도 배경에 깔려 있습니다.

1바이트 문자열은 넘길 때 주의해야 겠네요.

+ -

관련 글 리스트
13056 알쏭달쏭한 오브젝트 파스칼 문제 주정섭 3013 2007/06/05
13058     Re:알쏭달쏭한 오브젝트 파스칼 문제 박지훈.임프 2735 2007/06/05
13059         박지훈님의 답변에 대한 보충 글 주정섭 2562 2007/06/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.