C# 如何查找要在应用程序中使用的正确Windows系统错误代码?

C# 如何查找要在应用程序中使用的正确Windows系统错误代码?,c#,windows,error-code,C#,Windows,Error Code,我正在编写一个C#.NET 2.0应用程序,其中当预期通过SerialPort接收消息时。如果未收到帧(即超时)或确定帧无效,我需要使用SetLastError设置错误代码。Windows有过多的错误代码。是否有一个简单的工具或参考来帮助缩小要使用的正确错误代码 其他信息 虽然我倾向于抛出异常并在堆栈的更高层处理它,但在这种情况下,这不是一个选项,因为我正在更新的应用程序并不是为了利用这样一个有用的功能而设计的。您可以在这里找到它们的列表: 然后只需搜索“Serial”并使用最适合您的错误的一

我正在编写一个C#.NET 2.0应用程序,其中当预期通过
SerialPort
接收消息时。如果未收到帧(即超时)或确定帧无效,我需要使用
SetLastError
设置错误代码。Windows有过多的错误代码。是否有一个简单的工具或参考来帮助缩小要使用的正确错误代码

其他信息


虽然我倾向于抛出异常并在堆栈的更高层处理它,但在这种情况下,这不是一个选项,因为我正在更新的应用程序并不是为了利用这样一个有用的功能而设计的。

您可以在这里找到它们的列表:

然后只需搜索“Serial”并使用最适合您的错误的一个

在“good old days”(C和C++)中,可能的Windows错误列表在winerror.h中定义

更新:下面的链接已关闭。不确定该文件是否仍然可以下载,但可以在该链接中找到所有文件

这个文件可以在上找到(虽然我有点惊讶,它的日期可以追溯到2003年-可能值得寻找更新的版本)


但是,如果您正在获取(或想要设置)Win32错误代码,这将是定义所在的位置。

不幸的是,上述方法对我不起作用,但是这对我来说非常有效,粘贴整个代码以便可以直接在C中复制粘贴#

using System.Runtime.InteropServices;       // DllImport

public static string GetSystemMessage(int errorCode) {
int capacity = 512;
int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
StringBuilder sb = new StringBuilder(capacity);
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, IntPtr.Zero, errorCode, 0,
    sb, sb.Capacity, IntPtr.Zero);
int i = sb.Length;
if (i>0 && sb[i - 1] == 10) i--;
if (i>0 && sb[i - 1] == 13) i--;
sb.Length = i;
return sb.ToString();
}

[DllImport("kernel32.dll")]
public static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId,
    int dwLanguageId, StringBuilder lpBuffer, int nSize, IntPtr Arguments);
公共静态类WinErrors
{
/// 
///获取系统错误代码的用户友好字符串消息
/// 
///系统错误代码
///错误字符串
公共静态字符串GetSystemMessage(uint错误代码)
{
var exception=新的Win32Exception((int)errorCode);
返回异常消息;
}
}

为什么需要调用
SetLastError
?@SLaks:我想使用
SetLastError
,因为上面有一个功能可以将错误记录到文本文件中,我想这比什么都没有要好。感谢链接,但MSDN站点显示错误代码高达15999。我意识到这是一个老问题,但下面是显示错误层次结构的当前列表:
public static class WinErrors
{
    /// <summary>
    /// Gets a user friendly string message for a system error code
    /// </summary>
    /// <param name="errorCode">System error code</param>
    /// <returns>Error string</returns>
    public static string GetSystemMessage(uint errorCode)
    {
        var exception = new Win32Exception((int)errorCode);
        return exception.Message;
    }
}