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

What are the capitalized text identifiers for Win32 error codes called, and how can they be determined programmatically, given an error code?

listings of Win32 error codes中,每个错误都包含三个组成部分:

根据the documentation,术语"message identifier"指的是描述性消息,但它没有说明大写错误名称的术语是什么,我一直没能在任何地方找到它。这些标识符似乎类似于 PowerShell ErrorRecord 对象中所谓的 "Error Id",但谷歌搜索 "win32 error id" 和 "win32 error identifier" 没有得到答案。

例如在下面的错误中:

ERROR_TOO_MANY_OPEN_FILES

4 (0x4)

The system cannot open the file.

另外,给定错误代码,如何确定此文本值?我可以很容易地确定与给定错误代码关联的消息标识符,如下所示:

string MessageIdentifier = new Win32Exception(ErrorCode).Message;

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

在一些清单中,我看到这些类型的标识符被称为 "constants",但如果它们是常量,它们在哪里 defined/enumerated 以及如何从程序访问它们?

For example, in the following error:

ERROR_TOO_MANY_OPEN_FILES
4 (0x4)
The system cannot open the file.

4 is the error code.
The system cannot open the file. is the message identifier.
ERROR_TOO_MANY_OPEN_FILES is the __________?

最后两点你错了。 4 错误代码 消息标识符,与您链接到的 documentation 相同:

All Win32 error codes MUST be in the range 0x0000 to 0xFFFF, although Win32 error codes can be used both in 16-bit fields (such as within the HRESULT type specified in section 2.1) as well as 32-bit fields. Most values also have a default message defined, which can be used to map the value to a human-readable text message; when this is done, the Win32 error code is also known as a message identifier.

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

报道

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

//
// MessageId: ERROR_TOO_MANY_OPEN_FILES
//
// MessageText:
//
// The system cannot open the file.
//
#define ERROR_TOO_MANY_OPEN_FILES        4L

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

WINERROR (Constants)

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"