Microsoft MVP성태의 닷넷 이야기
.NET Framework: 104. Win32Exception 클래스 소개 [링크 복사], [링크+제목 복사],
조회: 20943
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 


Win32Exception 클래스 소개


.NET으로 Win32 API를 interop으로 호출을 할 때, 실패를 하면 그 원인을 알아낼 수 없어서 답답하지요. .NET에서는 Exception 클래스에서 친절한 오류 메시지를 알아낼 수 있지만, Win32 API를 호출했을 때는 그렇지 않습니다.

예를 들어 아래와 같은 OpenProcessToken이라는 Win32 API를 이용할 때,

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool OpenProcessToken(IntPtr processHandle, int acc, out IntPtr pHandleToken);

IntPtr tokenHandle = IntPtr.Zero;
IntPtr processHandle = new IntPtr(-2);

bool result
    = OpenProcessToken(processHandle,
    (int)(0x0020 | 0x00020000 | 0x0008),
    out tokenHandle);

위의 결과는 result == false가 나옵니다. 이런 경우, 왜 실패했는지를 알고 싶다면 Win32 API에서 제공되는 "GetLastError" API를 이용하면 되는데, 이 부분은 .NET BCL의 Marshal 타입에서 정적 메서드로 제공되고 있습니다. 그래서, 다음과 같이 그 원인을 알아낼 수 있습니다.

int errorCode = Marshal.GetLastWin32Error();

위와 같은 상황에서는 errorCode == 6입니다. 그런데, 6이라는 숫자가 어떤 걸 의미할까요? Visual C++에서는 Watch 윈도우의 변수에 ", hr"이라고 치면 오류값이 나옵니다. 아니면, 명령행 창에서 "NET HELPMSG <errorcode>"와 같이 치면 6에 대한 에러 메시지가 "The handle is invalid."라는 것을 알 수 있습니다. (Visual Studio 2008의 경우, C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\errlook.exe를 이용하는 것도 가능합니다.)

그렇다면, 코드로는 어떻게 알아낼 수 있을까요?

Visual C++에서는 FormatMessage Win32 API를 이용해서 오류 메시지를 얻어낼 수 있는데요. 인터넷 검색을 해보시면 아시겠지만, 코드가 그다지 깔끔하게 나오지는 않습니다. 기왕이면, .NET에서 제공되는 좀 더 매끄러운 방법을 찾아보는 것이 좋겠지요. ^^

제가 처음에 생각해 냈던 것은 아래와 같은 코드였습니다.

int hr = Marshal.GetHRForLastWin32Error();
Exception ex = Marshal.GetExceptionForHR(hr);
string errorMessage = ex.Message;

실제로 errorMessage == "The handle is invalid. (Exception from HRESULT: 0x80070006 (E_HANDLE))"라고 해서 만족할 만한 수준입니다. 나름 위의 방법도 답이 될 수도 있지만, 원래 Microsoft에서 제공되는 전용 타입이 있는 데 그것이 바로 "Win32Exception"입니다.

그래서, 최종적으로 다음과 같이 코딩을 할 수 있습니다.

int errorCode = Marshal.GetLastWin32Error();
Exception ex = new Win32Exception(errorCode);
string errorMessage = ex.Message; // "The handle is invalid."





[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  [175]  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
622정성태12/1/200831155오류 유형: 63. WPF - XamlParseException 대응 방법 [2]
621정성태11/30/200823371Team Foundation Server: 27. TeamBuild + VDPROJ 셋업 프로젝트 [1]
620정성태11/30/200822210디버깅 기술: 21. 올바른 이벤트 예외 정보 출력
619정성태11/30/200822270디버깅 기술: 20. 예외 처리를 방해하는 WPF Modal 대화창파일 다운로드1
618정성태11/29/200822814.NET Framework: 113. 이벤트에 속한 이벤트 핸들러 확인파일 다운로드1
617정성태11/26/200828332.NET Framework: 112. How to Interop DISPPARAMS [2]파일 다운로드2
616정성태11/26/200822102디버깅 기술: 19. C++/CLI - F11 디버깅 시의 변수 초기화파일 다운로드1
615정성태11/9/200831806.NET Framework: 111. WPF - Window, UserControl 클래스 상속 [1]
614정성태11/9/200831744.NET Framework: 110. WPF - 전역 예외 처리 [4]파일 다운로드1
613정성태11/8/200821349.NET Framework: 109. WPF - SystemColors 색상표파일 다운로드1
612정성태11/1/200826593.NET Framework: 108. WPF + WCF 환경에서는 DataContract를 권장 [1]
611정성태10/31/200820989오류 유형: 62. WPF - Visual Studio 2008 비정상 종료
610정성태10/24/200823167Team Foundation Server: 26. TFS 2008 SP1 + SQL Server 2008 설치
609정성태10/24/200826931.NET Framework: 107. WPF - RadioButton 데이터 바인딩 해제 현상파일 다운로드2
608정성태10/23/200821653오류 유형: 61. TFS 연결 오류: TF31003, TF30331 오류
607정성태10/18/200819505Windows: 32. 자동 실행 경로에 ".." 가 포함된 경우
606정성태10/18/200821514.NET Framework: 106. WCF - 다중 서비스 호스트파일 다운로드1
605정성태10/18/200824971.NET Framework: 105. WPF - 닫기 버튼을 없애려면.
604정성태10/18/200825523오류 유형: 60. System.Management.ManagementException - Generic failure [1]
602정성태10/15/200827437오류 유형: 59. WPF - XAML 로딩 시 Visual Studio 비정상 종료 [1]
600정성태10/9/200832154디버깅 기술: 18. TFS Team Build + Source Server = 소스 코드 디버깅 [3]
603정성태10/15/200824051    답변글 디버깅 기술: 18.1. 소스 서버 구성, 그 외의 이야기
599정성태10/5/200830024디버깅 기술: 17. TFS Team Build + Symbol Server [1]
598정성태10/3/200820006VS.NET IDE: 57. VS.NET 2008 - 다중 프로젝트에서 단일 SNK를 사용하는 방법
597정성태10/2/200818665Team Foundation Server: 25. VSTS 2008의 Build Explorer
596정성태10/2/200825401오류 유형: 58. WPF : 드롭다운 유형의 ComboBox가 펼쳐지지 않는 문제
... 166  167  168  169  170  171  172  173  174  [175]  176  177  178  179  180  ...