如何查找适用于我的应用程序的正确的Windows系统错误代码?

3
我正在编写一个 C# .NET 2.0 应用程序,当通过 SerialPort 接收消息时,如果未接收到帧(即超时)或确定为无效,则需要使用 SetLastError 设置错误代码。 Windows 拥有大量的错误代码。 是否有简单的工具或参考资料可帮助缩小使用正确错误代码的范围? 附加信息 尽管抛出异常并在更高的堆栈中处理它是我首选的方法,但在这种情况下不是一个选项,因为我正在更新的应用程序没有设计利用这个有用功能。

1
为什么需要调用 SetLastError - SLaks
@SLaks:我想使用SetLastError,因为更高层次上有一个将错误记录到文本文件的功能,这比没有好些。 - Jim Fell
4个回答

6

很不幸,以上方法对我并没有起作用。不过,下面这个方法完美地解决了我的问题。我将整段代码粘贴在这里,可以直接复制到C#中使用。

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;
    }
}

2
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);

0

在“好的旧日子”(C和C++)中,可能的Windows错误列表是在winerror.h中定义的。

更新:下面的链接已失效。不确定文件是否仍可下载,但所有Windows系统错误代码定义都可以在此链接找到。

该文件可以在微软网站上找到(尽管它让我有点惊讶,因为它的日期可以追溯到2003年,也许值得寻找更近期的版本)。

但如果您正在获取(或希望设置)Win32错误代码,这将是找到定义的地方。


我知道这是一个老问题,但这里有一个当前列表,显示错误层次结构: http://msdn.microsoft.com/en-us/library/z4c5tckx.aspx - Des Horsley

0

谢谢提供链接,但是MSDN网站显示错误代码最高可达15,999。http://msdn.microsoft.com/en-us/library/ms681381%28VS.85%29.aspx - Jim Fell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接