C# Win32错误代码的大写文本标识符是什么?在给定错误代码的情况下,如何通过编程确定它们?
在中,每个错误有三个组件:C# Win32错误代码的大写文本标识符是什么?在给定错误代码的情况下,如何通过编程确定它们?,c#,winapi,error-code,win32exception,C#,Winapi,Error Code,Win32exception,在中,每个错误有三个组件: 数字错误代码 描述性的信息 由用下划线分隔的大写单词组成的标识符 根据,术语“消息标识符”指的是描述性消息,但它没有说明大写错误名称的术语,我在任何地方都找不到。这些标识符似乎类似于PowerShell ErrorRecord对象中的“错误Id”,但通过谷歌搜索“win32错误Id”和“win32错误标识符”并没有找到答案 例如,在以下错误中: 错误\u太多\u打开\u文件 4(0x4) 系统无法打开该文件 4是错误代码 系统无法打开文件。是消息标识符 错误\u
- 数字错误代码
- 描述性的信息
- 由用下划线分隔的大写单词组成的标识符
是错误代码李>4
是消息标识符李>系统无法打开文件。
是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu错误\u太多\u打开\u文件
string MessageIdentifier = new Win32Exception(ErrorCode).Message;
但是,似乎没有与这些大写错误名称对应的属性(类似于ErrorRecord类的ErrorId属性)
在一些清单中,我看到这些类型的标识符被称为“常量”,但如果它们是常量,它们在哪里定义/枚举,以及如何从程序访问它们
例如,在以下错误中:
错误\u太多\u打开\u文件4(0x4)
系统无法打开该文件 •
4
是错误代码•
系统无法打开文件。
是消息标识符•
错误\u太多\u打开\u文件
是否为
你在最后两点上错了4
是错误代码和消息标识符,与您链接到的相同:
所有Win32错误代码必须在0x0000到0xFFFF范围内,尽管Win32错误代码既可以在16位字段中使用(例如在第2.1节中指定的HRESULT类型中),也可以在32位字段中使用。大多数值还定义了默认消息,可用于将值映射到人类可读的文本消息完成此操作后,Win32错误代码也称为消息标识符。
系统无法打开该文件。
是属于消息标识符4
的消息文本。该文本由和报告
错误\u太多\u打开的\u文件
只是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中都没有函数返回文本错误\u太多\u打开\u文件
,因为错误代码4
。如果需要该功能,您必须编写自己的查找代码,如pinvoke.net示例所示:
我很确定“系统无法打开文件”是描述,错误\u TOO\u MANY\u open\u FILES是消息标识符。@我已经看到了,但它没有回答我问题的任何部分。它没有告诉我正确的术语是什么,它明确地将每一个定义为一个常数,一个接一个。这并没有告诉我如何通过编程确定与给定错误代码相对应的文本标识符,只允许您使用已经在代码中手动查找和定义的文本名称引用数字代码,这没有抓住要点。@RonBeyer直觉上听起来是这样的,但链接文档说“消息标识符”是描述。您不希望向用户显示错误名称。它们用于源代码中。向用户显示描述。这可以通过调用FormatMessage获得。是的,我现在确实看到我误读了文档如何定义“消息标识符”“我想它是说描述性消息被称为消息标识符,但实际上它说错误代码是消息的消息标识符。不管怎么说,它听起来像C++。那么,你是说,为错误命名有意义的唯一方法就是自己定义它们?那么,在本质上,这些只是在为错误代码定义自己的常量时使用的建议名称?奇怪的是,当API没有定义这些名称时,微软却在其文档中到处使用这些名称,他们甚至懒得在文档中解释这些名称|h代表C/C++,是的。NET中的错误处理通常基于异常(其中与Win32相关的错误基于
Win32Exception
)。您通常不需要实际的错误代码,但如果需要,您可以访问它。NET通常为特定错误提供不同的异常类型。但是,如果使用PInvoke直接调用Win32函数,则必须自己进行错误处理,并定义自己的常量。您可以在适当的时候将DllImport.SetLastError
属性设置为true(并非所有API都使用SetLastError()
),以便通过Marshal.GetLastWin32Error()
。。。。。。或者您可以在不提供输入值的情况下引发Win32Exception()
,因此它会为您调用Marshal.GetLastWin32Error()
。标准模式是(!SomeWin32Func())抛出新的Win32Exception()代码>可以很容易地包装在helper方法中
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"