2009-10-30 4 views
25

p/invoke를 사용하여 일부 창 기능을 사용하고 있습니다. 때때로 ERROR_SUCCESS (이상한 이름)가 아닌 오류 코드가 나타납니다.16 진수에서 Windows 시스템 오류 코드 제목/설명 얻기

프로그램 내에서이를 찾는 방법이 있습니까? 내가 오류 1017를 얻을 경우 Forexample, 나는이 시스템은로드하거나 레지스트리로 파일을 복원하려고 시도했지만 지정된 파일이 레지스트리 파일 형식이 아닌 한 사용자에게

을 알 수 있습니다. (ERROR_NOT_REGISTRY_FILE : 0x3F9)

대신

오류 코드 : 1017

답변

76

나는 niifty의 .NET 래퍼가 있다면 모르겠지만, 당신이하는 formatMessage API 호출 할 수 있습니다 P/Invoke를 사용합니다.

네이티브 코드에서 일반적으로 호출되는 방법은 this answer을 참조하십시오. 질문은 HRESULT에서 오류 코드를 가져 오는 것을 의미하지만 답변은 GetLastError/GetLastWin32Error에서 오는 일반 OS 오류 코드의 코드를 검색하는 데에도 적용됩니다.

편집 :

using System.ComponentModel; 

string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message; 
Console.WriteLine(errorMessage); 
+2

HTTP : //www.pinvoke합니다. net/default.aspx/kernel32/FormatMessage.html 결코 FormatMessage를 사용하지 않는다고 말합니다. – Malfist

+0

@Malfist, 그것을 지적 해 주셔서 감사합니다. 오류 코드를 검색하기 위해 Marshal.GetLastWin32Error를 사용하는 한 괜찮습니다. 그럼에도 불구하고 Win32Exception이 더 나은 솔루션 인 것처럼 보입니다. –

+2

그러나 두 솔루션 모두 설명적인 오류 메시지 만 표시합니다. 이들 중 어느 것도 문서에서 볼 수있는 밑줄 (** ERROR_NOT_REGISTRY_FILE **)이있는 대문자로 된 오류 이름을 갖지 않습니다. 여기에 와서 그것에 궁금한 사람은 최근에 [프로그래밍 방식으로 오류 이름을 결정하는 방법에 관한 질문] (http://stackoverflow.com/q/30203717/1248365)을 요청했으며 응답이 당신은 할 수 없습니다. Windows SDK에서 제공하는 C++ 포함 파일 인 winerror.h의 상수 이름을 참조합니다. –

-2

예 그것을 수행하는 기능이있다하지만 난 그게 뭔지 기억하지 않습니다 대안을 포함 나를 pinvoke.net 가리키는 주셔서 감사합니다 Malfist는 API를 관리. 그 동안 오류 찾아보기 도구 (도구 -> 오류 찾아보기)를 사용하여 Visual Studio에서 특정 코드의 의미를 확인할 수 있습니다.

+2

아니면 그냥 Nick이 말한대로해라 :-) –

+1

나는 이것을 보지 않는다. 그리고 이것은 사용자에게 무엇이든 표시하는 데 도움이되지 않습니다. – Malfist

+1

이것은 OP의 질문에 어떻게 대답합니까? – SepehrM

0

P/Invoke를 통해 FormatMessage를 호출하는 대신 관리되는 대안을 찾아이 페이지를 방문했습니다.

다른 사람들이 말했듯이, 대문자와 강조 표시된 이름을 얻는 방법은 없습니다. winerror.h에서 찾지 못했습니다. 온라인에서 정보를 검색하는 여러 곳에서 온라인으로 재현 된 것을 보았습니다. 특정 상태 코드를 해결하는 방법. winerror.h 자체에 대한 빠른 Google 검색은 Rensselaer Polytechnic Instutute에있는 페이지를 밝혀 냈습니다. 여기서 누군가가 도움이되는 #define 문을 추출했습니다.

내 생각을봤을 때; 필자는 winerror.h의 소스 코드에서 작업하면서 최신 버전의 Microsoft Visual Studio와 함께 제공되는 Windows Platform SDK의 일부로 작업 할 수있는 방법이 있다고 생각합니다.

지금 당장은이 페이지로 이동 한 .NET 어셈블리에서 중요한 문제를 정리하는 중입니다. 그러면 내가 함께 자갈을 볼 수 있습니다. 이런 종류의 도전은 내 골목 바로 위에 있고, 누군가는 결투를 던졌습니다.

1

winerror에서 정의를 가져올 수 있습니다.Rensselaer Polytechnic Institute에서 시간 및 열거에 넣어 : 당신의 오류 코드는 변수 ERROR_CODE에있는 경우

public enum Win32ErrorCode : long 
{ 
    ERROR_SUCCESS = 0L, 
    NO_ERROR = 0L, 
    ERROR_INVALID_FUNCTION = 1L, 
    ERROR_FILE_NOT_FOUND = 2L, 
    ERROR_PATH_NOT_FOUND = 3L, 
    ERROR_TOO_MANY_OPEN_FILES = 4L, 
    ERROR_ACCESS_DENIED = 5L, 
    etc. 
} 

그런 다음 다음을 사용 :

Enum.GetName(typeof(Win32ErrorCode), error_code); 
+2

http://www.pinvoke.net/default.aspx/Constants/WINERROR.html에서 이들을 담고있는 복사 - 붙여 넣기 클래스가 있습니다. –