네, 아까 글을 쓰면서도 혹시나 그렇게 생각하신 것이 아닌가 싶었습니다. 빌더님이나 카라얀님이나 VCL과 무관한 OS 레벨의 에러로 생각하셨기 때문에 'Runtime error 217' 에러에 대해 그렇게 받아들인 것이 아닌가 하고요. 그런데 두분 다 VCL 코드에 익숙한 분들이시고, 더욱이 두 유닛의 소스코드를 직접 확인도 해봤다는 듯이 글을 쓰시길래 설마 했던 겁니다.
OS 레벨의 저수준 에러를 말하는 거라면 제가 델파이와 C++빌더에 대한 팁으로 글을 썼을 리가 없지 않습니까.
제가 그 정도도 몰라서 코딩의 문제가 아닌 OS 레벨의 에러를 코딩 에러다, 라고 억지 주장을 하고 있다고 보셨는지요.
델파이나 C++빌더 개발을 하는 과정에서 이 'Runtime error 217'을 만나는 경우는 OS 에러로 인한 경우보다 initialization의 문제인 경우가 압도적으로 많습니다. 제가 제 코드이건 다른 개발자의 코드를 리뷰할 때건, 델파이나 C++빌더에서 이 'Runtime error 217'에 부딛힌 경우는, 제 기억으로는 모두 이런 코딩의 문제였습니다. 거의 백이면 백 정도의 확률로 OS 에러가 아니라 코딩의 오류라는 겁니다.
더욱이 제가 팁 제목에서 전제했듯이 '프로그램 기동시'에 나타나는 'Runtime error 217' 에러는 더욱 더 OS 에러와는 무관할 가능성이 높습니다. 물론 정말 드물게는 같은 것일 수도 있지만요. 그래서 System 유닛에서 'Runtime error 217' 라는 에러메시지를 만들어서 뿌리는 루틴과, 그 루틴이 어떻게 해서 호출되는지까지 일일이 설명을 드렸고요. 제가 설명한 놈은 OS 에러가 아니라는 거죠.
최근 몇년 사이에 델파이와 C++빌더 코드에서 이 에러가 더 많이 발생한 이유는, 비스타 이전의 윈도우XP까지의 윈도우 버전에서는 initialization 섹션에서 권한 상승이 필요한 코드를 썼더라도 당연히 에러가 나지 않기 때문입니다. 그래서 델파이, C++빌더 개발자들이 기존에 잘 돌아가던 동일한 프로그램을 윈도우7에서 돌렸더니 갑자기 'Runtime error 217' 에러가 나면서 프로그램이 죽어버리는 현상들을 많이 접하게 된 것입니다.
그런데, 전 설마 했는데, 이번에 말씀하신 대로라면, 빌더님과 카라얀님은 VC에서 이슈가 되는 정말 드물게 발생하는 'Runtime error 217' 케이스를 델파이와 C++빌더 개발자들이 흔히 접하는 'Runtime error 217' 에러가 당연히 같은 것이다, 라고 단정부터 하시고는 제 팁이 틀렸다고 지적하신 것입니다.
믿기지 않으신다면, 앞서 글에서 예제로 들었던 간단한 코드를 실제로 한번 돌려보세요. 윈도우7에서 UAC 동작중인 상태에서 권한 상승을 하지 않고 아래 코드를 돌리면 항상 'Runtime error 217' 에러가 발생합니다. 'Runtime error 217' 에러가 OS 레벨의 에러일뿐 코딩 오류와는 무관하다면 이게 특정 조건에서 항상 발생할 수는 없는 거 아니겠습니까?
initialization
TFileStream.Create('c:\111.txt', fmCreate);
카라얀 님이 쓰신 글 :
: 제가 이 글에 답변을 쓴 이유는 박지훈님이 쓴 글을 오래 전에 저도 읽어 보았고, SysUtils.pas의 Initialization 섹션에서 Exeception Handler가 설치 되기 전이기 때문이라는 이유 때문입니다. 델파이에서 기본적인 예외처리 핸들러의 셋업은 SysUtils 이전에 System.pas에서 명백히 초기화 되지요. 그리고 Runtime Error 217 은 시스템 주요파일이 손상 되어 있거나, 시스템 레지스트리 등이 깨져있을 때, 이유는 버그가 있는 프로그램의 설치로 인해서, 또는 서비스팩 업데이트 중 얘기치 않은 설치 오류로 인해 시스템 주요 파일이나 레지스트리등이 깨져 있을 때, 이를 운영체제에서 에러 상황으로 보고 런타임 에러를 발생하게 됩니다.
: Runtime Error 217은 부팅과정에서 나타날 수도 있고, 탐색기나 웹브라우저 등 프로그램 실행할 때, 델파이와 상관없이 나타날 수 있는 운영체제 에러 상황입니다. SysUtils에서 파일처리 래퍼함수들을 구현하고 있으니까 오히려 델파이에서 편의대로 운영체제 에러인 Runtime Error 217을 오버라이딩 해서 처리하고 있는 거지요. ^^
:
|