代码之家  ›  专栏  ›  技术社区  ›  Malfist

从其十六进制数获取Windows系统错误代码标题/说明

  •  30
  • Malfist  · 技术社区  · 15 年前

    我正在使用p/invoke处理一些Windows函数。偶尔,我会得到一个错误代码,这不是错误成功(这样一个奇怪的名字)。

    有没有办法在程序中查找这些内容?例如,如果我得到错误1017。我能告诉用户吗

    系统试图加载或 将文件还原到注册表中,但是 指定的文件不在 注册表文件格式。 (错误\u不是\u注册表\u文件:0x3f9)

    而不是

    错误代码:1017

    4 回复  |  直到 8 年前
        1
  •  93
  •   Community CDub    8 年前

    我不确定是否有niifty.net包装器,但是您可以使用p/invoke调用formatmessage a p i。

    this answer 它通常是如何从本机代码调用的。尽管该问题涉及从hresults获取错误代码,但该答案也适用于从getlasterror/getlastwin32error的常规操作系统错误代码中检索代码。

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

    using System.ComponentModel;
    
    string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
    Console.WriteLine(errorMessage);
    
        2
  •  2
  •   flapster    9 年前

    你可以从winerrror.h.at Rensselaer Polytechnic Institute ,并将它们放入枚举中:

    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);
    
        3
  •  0
  •   David A. Gray    9 年前

    我在这个页面上登陆的时候,正在寻找通过P/Invoke调用formatmessage的托管替代方法。

    正如其他人所说,除了在winerrror.h中查找姓名外,没有任何方法可以得到这些大写的、下划线的姓名,我在网上看到这些姓名在我登陆的各个地方被转载,在寻找有关解决特定状态码的信息的过程中。在谷歌上搜索winerrror.h,发现了一个页面 Rensselaer Polytechnic Instutute ,其中有人从中有效地提取了define语句。

    看着它,我有了一个想法;我想可能有一种方法可以做到这一点,从winerrror.h的源代码开始工作,这是我所拥有的Windows平台SDK的一部分,它与每一个最新版本的Microsoft Visual Studio一起提供。

    现在,我正在整理.NET程序集中的一个紧迫问题,该问题将我带到该页。然后,我来看看我能做些什么;这种挑战就在我的巷子里,有人扔下了一个手套。

        4
  •  -3
  •   Jon Norton    15 年前

    是的,有一个函数可以做到这一点,但我不记得它是什么。同时,您可以使用错误查找工具(工具->错误查找)在Visual Studio中查看特定代码的含义。