从其hex数中获取Windows系统错误代码标题/说明

我正在搞一些使用p / invoke的windows函数。 偶尔,我得到一个不是ERROR_SUCCESS的错误代码(这个奇怪的名字)。

有没有办法在程序中查看这些内容? 例如,如果我得到错误1017.我可以告诉用户

系统已尝试将文件加载或还原到registry中,但指定的文件不是registry文件格式。 (ERROR_NOT_REGISTRY_FILE:0x3F9)

代替

错误代码:1017

我不确定是否有一个很好的.NET包装器,但你可以使用P / Invoke调用FormatMessage API。

看到这个答案是如何通常从本地代码调用。 虽然这个问题涉及从HRESULT获取错误代码,但是也适用于来自GetLastError / GetLastWin32Error的常规操作系统错误代码中的retreiving代码。

编辑:谢谢Malfist指向我pinvoke.net,其中包括替代,托管API:

using System.ComponentModel; string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message; Console.WriteLine(errorMessage); 

你可以从Rensselaer理工学院的 winerror.h中获得这个定义,并把它们放到Enum中:

 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. } 

那么如果你的错误代码是在一个变量error_code你可以使用:

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

我登陆这个页面,同时寻找一个通过P / Invoke调用FormatMessage的托管替代方法。

正如其他人所说,没有办法得到这些大写,强调的名字,而不是在winerror.h中查找他们,我已经看到在我登陆的各个地方在搜索有关解决具体情况码。 在Rensselaer Polytechnic Instutute ,一个快速的Google搜索winerror.h自己发现了一个页面,在那里有人从中有效地提取了#define语句。

看着它,给了我一个主意。 我认为可能有一种方法可以实现,使用winerror.h的源代码,这是我的最新版本的Microsoft Visual Studio附带的Windows Platform SDK的一部分。

现在,我正在整理一个.NET程序集中的一个紧迫的问题,把我带到这个页面。 然后,我会看到我可以拼凑在一起。 这种挑战就在我的胡同里,有人扔下了手套。

是的,有一个功能,但我不记得它是什么。 同时,您可以使用错误查找工具(“工具” – >“错误查找”)查看Visual Studio中特定代码的含义。