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

Mal*_*ist 32 .net c# windows pinvoke

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

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

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

代替

错误代码:1017

Nic*_*yer 96

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

请参阅此答案,了解如何从本机代码调用它.虽然问题是从HRESULTs中获取错误代码,但答案也适用于来自GetLastError/GetLastWin32Error的常规OS错误代码的retreiving代码.

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

using System.ComponentModel;

string errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
Console.WriteLine(errorMessage);
Run Code Online (Sandbox Code Playgroud)

  • http://www.pinvoke.net/default.aspx/kernel32/FormatMessage.html表示永远不要使用FormatMessage (3认同)
  • 但请注意,这两种解决方案只能获得描述性错误消息; 这些都不会使用您在文档中看到的下划线(例如**ERROR_NOT_REGISTRY_FILE**)获取大写的错误名称.对于那些登陆这里并且对此感到疑惑的人,我最近问[一个特别关于如何以编程方式确定这些错误名称的问题](http://stackoverflow.com/q/30203717/1248365),答案结果证明是那你不能.它们引用winerror.h中的常量名称,winerror.h是Windows SDK中提供的C++包含文件. (3认同)
  • @matthias_buehlmann 您是否将“DllImportAttribute.SetLastError”设置为“true”?另请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.dllimportattribute.setlasterror (2认同)