我正在使用p / invoke搞乱一些windows函数。偶尔,我得到的错误代码不是ERROR_SUCCESS(这么奇怪的名字)。
有没有办法在程序中查看这些内容?例如,如果我收到错误1017.我可以告诉用户
系统已尝试加载或 将文件还原到注册表中,但是 指定的文件不在 注册表文件格式。 (ERROR_NOT_REGISTRY_FILE:0x3F9)
而不是
错误代码:1017
答案 0 :(得分:93)
我不确定是否有一个有趣的.NET包装器,但您可以使用P / Invoke调用FormatMessage API。
有关如何从本机代码调用它的信息,请参阅this answer。虽然问题是从HRESULTs中获取错误代码,但答案也适用于来自GetLastError / GetLastWin32Error的常规操作系统错误代码的检索代码。
编辑:感谢Malfist将我指向pinvoke.net,其中包括替代的托管API:
using System.ComponentModel;
string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Console.WriteLine(errorMessage);
答案 1 :(得分:2)
您可以在Rensselaer Polytechnic Institute处获取winerror.h中的定义,并将它们放入枚举中:
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);
答案 2 :(得分:0)
我在寻找通过P / Invoke调用FormatMessage的托管替代方法时登陆此页面。
正如其他人所说的那样,没有办法获得那些大写的,强调的名字,而不是在winerror.h中查找它们,我已经看到了在我在寻找有关信息的过程中登陆的各个地方的在线复制解决特定的状态代码。对于winerror.h的快速Google搜索本身在Rensselaer Polytechnic Instutute发现了一个页面,其中有人帮助从中提取了#define语句。
看着它给了我一个主意;我认为可能有一种方法可以实现,从我的winerror.h的源代码开始,作为每个最新版本的Microsoft Visual Studio附带的Windows平台SDK的一部分。
现在,我正在整理.NET程序集中的一个紧迫问题,这个问题将我带到了这个页面。然后,我会看到我可以凑齐的东西;这种挑战正好在我的巷子里,而且还有人摔倒了。
答案 3 :(得分:-3)
是的,有一个功能可以做到这一点,但我不记得它是什么。同时,您可以使用错误查找工具(工具 - >错误查找)来查看特定代码在Visual Studio中的含义。