如何处理Win32错误消息的占位符?

时间:2014-01-22 11:14:40

标签: winapi

当程序遇到Win32错误时,我想提供有意义的错误消息。我拨打GetLastError,然后拨打FormatMessage。但是一些错误消息包含占位符。例如,ERROR_BAD_EXE_FORMAT的文字为:

  

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

据推测,%1意味着被无效的模块名称所取代。我该如何影响更换?

请注意,我理想地喜欢一般解决方案,因为我注意到占位符存在许多错误。我可以在文档中看到以下消息:

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

2 个答案:

答案 0 :(得分:2)

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

  

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

答案 1 :(得分:1)

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()