【问题标题】:How do I deal with placeholders for Win32 error messages?如何处理 Win32 错误消息的占位符?
【发布时间】:2014-01-22 11:14:40
【问题描述】:

我想在我的程序遇到 Win32 错误时显示有意义的错误消息。我打电话给GetLastError,然后是FormatMessage。但是一些错误消息包含占位符。例如,ERROR_BAD_EXE_FORMAT 包含以下文字:

%1 不是有效的 Win32 应用程序。

据推测,%1 是要替换为无效模块的名称。我怎样才能实现替换?

请注意,理想情况下,我希望有一个通用的解决方案,因为我注意到占位符有很多错误。我可以在文档中看到以下消息:

  • 驱动器中有错误的软盘。将 %2(卷序列号:%3)插入驱动器 %1。
  • 操作系统无法运行 %1。
  • 此版本的 %1 与您运行的 Windows 版本不兼容。检查您计算机的系统信息,然后联系软件发行商。
  • 图像文件 %1 已签名,无法修改。
  • 系统在 %2 的消息文件中找不到消息号 0x%1 的消息文本。
  • ...等等。

【问题讨论】:

标签: winapi


【解决方案1】:

我认为 Raymond Chen 在他的blog 的评论中有效地回答了这个问题,他写道:

系统错误消息包含 %1 插入也让我感到困扰,您必须根据具体情况“知道”。

【讨论】:

    【解决方案2】:

    ERROR_BAD_EXE_FORMAT 包含插入 %1。您可以使用FormatMessage() 的最后一个参数来替换它。这段代码是一个小示例。

    LPWSTR pMessage = L"%1";
    DWORD_PTR pArgs[] = {(DWORD_PTR)L"My_Test_App.exe" }; 
    
    TCHAR buffer[1024];
    DWORD dwError = ERROR_BAD_EXE_FORMAT;
    DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY;
    DWORD dwResult = FormatMessage(dwFlags, pMessage, dwError, 0, buffer, 1024,  (va_list*)pArgs);
    if (dwResult) 
    {
        //now, 'buffer' contains below message.
    
        //
        //My_Test_App.exe is not a valid Win32 application.
        //
    }
    

    我知道有些系统错误代码有插入。我认为我们不能为所有这些提供相关的论据。所以,如果我是你,我只想使用系统错误代码,而不是FormatMessage()。或者,支持参数列表和FormatMessage()仅用于一些经常出现的系统错误代码。

    【讨论】:

    • 您是否建议我必须针对每个可能的错误代码逐案执行此操作?
    • 不,绝对不是。不可能。我认为几乎 Windows 应用程序都有自己的错误消息格式的一个原因是因为这种情况。我只是想告诉你如何替换占位符,如果你不知道的话。
    • @CodeDreamer:使用FORMAT_MESSAGE_FROM_SYSTEM时,lpSource参数不使用,可以设置为NULL而不是指定“%1”。
    • @DavidHeffernan:是的,你必须根据具体情况处理插入,因为不同的错误代码需要不同的参数,如果有的话。
    猜你喜欢
    • 2010-11-13
    • 2016-10-15
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多