박지훈.임프 님이 쓰신 글 :
: 포럼에는 댓글 알림 기능이 없어서... (안만든 놈이 바로 저... --;;)
: 한달 넘게 전에 댓글 다신 것을 이제야 봤습니다. 좋은 고견 감사드리구요.
:
: 근데, 제 생각에는 빌더님이 잘못 알고 계신 것 같아서, 추가로 제 생각을 댓글로 썼습니다.
: 혹시 제 논리가 틀린 것 같으면 지적 부탁드립니다. ^^;;;;
:
:
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_tip&no=290
자세한 설명은 빌더님께서 답변해주시겠지만 VCL 초기화 과정을 잠간 살펴 본 바로는 오히려 박지훈님이 잘못 알고 계신 것 같습니다. ^^
실행파일의 경우 VCL의 초기화 과정은 SysInit.pas의 _InitExe 부터 시작하는데, 64비트 예외처리 방식은 저도 그런게 있다는 것만 알고 있고 자세한 내용은 몰라서 32비트 예외처리로 한정해서 살펴 보면, _InitExe에서 System.pas의 _StartExe를 호출하는데, 여기서 이미 예외처리를 위한 셋업이 이루어 집니다. 스텍프레임 방식으로 예외를 처리하기 위한 프레임을 구성한 후, System.pas의 InitUnits를 호출하는데, InitUnits에서 하는 일은 링크시 포함되는 유닛들의 Initialization 섹션들을 호출해서 초기화 하는게 전부 입니다.
_StartExe에서 이미 예외처리를 위한 셋업이 되어 있기 때문에
각기 유닛들의 Initialization 섹션을 호출해서 초기화 하는 InitUnits 는 다음과 같이 try... except 블럭을 사용할 수 있게 됩니다.
try
while I < Count do
begin
P := Table^[I].Init;
Inc(I);
InitContext.InitCount := I;
if Assigned(P) and Assigned(Pointer(P^)) then
begin
{$IF defined(MSWINDOWS)}
TProc(P)();
{$ELSEIF (defined(POSIX) and defined(CPUX86))}
CallProc(P, InitContext.Module^.GOT);
{$ELSE}
TProc(P)();
{$ENDIF}
end;
end;
except
FinalizeUnits;
raise;
end;
SysUtils.pas의 Initialization 섹션을 포함한 모든 유닛들의 Initailization 코드들은 이미 예외처리가 동작하는 상황에서 호출이 됩니다.
그리고 SysUtils.pas의 Initialization 섹션에서는 예외처리와 관련한 코드가 전혀 없습니다.
빌더님이 말씀하신 대로 SysUtils.pas와 상관없이 이미 System.pas에서 예외처리를 위한 셋업이 완료되고, 그 이후에 추가로 설치되는 예외핸들러는 System.pas에서 핸들링되는 예외처리에 대한 세컨드, 서드 식의 Chained 예외 핸들러에 불과할 뿐이죠.
제 생각엔 오히려 박지훈님이 잘못 알고 계신 것 같은데요 ^^