什么是 Win32 错误代码的大写文本标识符,以及如何在给定错误代码的情况下以编程方式确定它们?

Adi*_*bar 3 c# winapi error-code win32exception

Win32 错误代码列表中,每个错误都有三个组成部分:

  • 数字错误代码
  • 描述性消息
  • 由下划线分隔的大写单词组成的标识符

根据文档,术语“消息标识符”指的是描述性消息,但它没有说明大写错误名称的术语是什么,而且我在任何地方都找不到。这些标识符似乎类似于 PowerShell ErrorRecord 对象中所谓的“错误 ID”,但在谷歌上搜索“win32 错误 id”和“win32 错误标识符”并没有找到答案。

例如,在以下错误中:

ERROR_TOO_MANY_OPEN_FILES

4 (0x4)

系统无法打开文件。

  • 4错误代码
  • The system cannot open the file.消息标识符
  • ERROR_TOO_MANY_OPEN_FILES 是个 __________?

另外,在给定错误代码的情况下,如何确定此文本值?我可以轻松确定与给定错误代码相关联的消息标识符,如下所示:

string MessageIdentifier = new Win32Exception(ErrorCode).Message;
Run Code Online (Sandbox Code Playgroud)

但是,Win32Exception 类似乎没有与这些大写错误名称对应的属性(类似于 ErrorRecord 类的ErrorId属性)。

在一些清单中,我看到这些类型的标识符称为“常量”,但如果它们是常量,它们在哪里定义/枚举以及如何从程序访问它们?

Rem*_*eau 5

例如,在以下错误中:

ERROR_TOO_MANY_OPEN_FILES
4 (0x4)
系统无法打开文件。

4是错误代码。
The system cannot open the file.是消息标识符。
ERROR_TOO_MANY_OPEN_FILES是________?

最后两点你错了。 4两者的错误代码消息识别符,每同一文档你地连接至:

所有 Win32 错误代码必须在 0x0000 到 0xFFFF 的范围内,尽管 Win32 错误代码既可以用于 16 位字段(例如在第 2.1 节中指定的 HRESULT 类型中),也可以用于 32 位字段。大多数值还定义了默认消息,可用于将值映射到人类可读的文本消息;完成此操作后,Win32 错误代码也称为消息标识符。

The system cannot open the file.是属于消息标识符的消息文本4。该文本由FormatMessage()和报告Win32Exception.Message

ERROR_TOO_MANY_OPEN_FILES#define在 Win32 SDK 中的 winerror.h 中只是人类可读的:

//
// MessageId: ERROR_TOO_MANY_OPEN_FILES
//
// MessageText:
//
// The system cannot open the file.
//
#define ERROR_TOO_MANY_OPEN_FILES        4L
Run Code Online (Sandbox Code Playgroud)

Win32 API 或 .NET 中没有函数可以返回ERROR_TOO_MANY_OPEN_FILES给定错误代码的文本4。如果需要该功能,则必须编写自己的查找代码,如以下 pinvoke.net 示例所示:

WINERROR(常量)

int errorCode = 4; //Microsoft.Win32.Interop.ResultWin32.ERROR_TOO_MANY_OPEN_FILES
string identName = Microsoft.Win32.Interop.ResultWin32.GetErrorName(errorCode);
// returns "ERROR_TOO_MANY_OPEN_FILES"
Run Code Online (Sandbox Code Playgroud)