如何从 Win32 提供的 HRESULT C# 中获取消息字符串

How to fetch the message string from Win32 provided HRESULT C#

我很好奇 C# 中是否有一个函数可以将从非托管代码中获取的 Win32 HRESULT (long) 错误代码转换为 string.

的表示形式

我不知道有一个函数,但解决方法很简单。

public static string formatMessage( int hr ) =>
    Marshal.GetExceptionForHR( hr ).Message;

更新:“重复”问题非常不同。

HRESULT 代码记录在 section 2.1 of the [MS-ERREF] spec

通过使用 Severity=1 和 Facility=FACILITY_WIN32,可以将任何 Win32 代码打包到 HRESULT 中。反之则不然,FACILITY_WIN32 只是其中之一。使用 Win32Exception 的“重复”问题的已接受答案不适用于此问题。

这是一个快速演示。

static void testHresultMessages()
{
    int hr = new OverflowException().HResult;

    // Prints "Unknown error (0x80131516)"
    Console.WriteLine( new Win32Exception( hr ).Message );

    // Prints "Arithmetic operation resulted in an overflow."
    Console.WriteLine( Marshal.GetExceptionForHR( hr ).Message );
}