在使用FormatMessage检索Windows API错误消息时,我应该设置Arguments参数吗?

时间:2015-03-01 09:23:37

标签: c++ windows winapi error-handling

我正在尝试获取与GetLastError Windows API函数相关的错误消息。

我已按照此处给出的与FormatMessage函数相关的示例:

How to get the error message from the error code returned by GetLastError()?

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680582%28v=vs.85%29.aspx

我的实现是返回一个字符串,但通过测试注意到一些错误消息包括诸如“%1”之类的文本。例如,对于错误代码574:

  

{Application Error}应用程序位置0x%08lx处发生异常%s(0x%08lx)。

我假设通过在Arguments函数中设置FormatMessage参数来解决此问题。但是,我找不到合适的教程/示例来在系统错误消息上设置此参数。我提供的链接将此参数设置为NULL

这是因为通过SetLastError设置上一条错误消息的任何Windows API调用从不使用与使用Arguments参数的消息对应的代码吗?

否则,如何为系统错误消息创建这样的va_list

1 个答案:

答案 0 :(得分:2)

对不起,理想情况下应该是评论,除了设计上缺乏对技术评论的支持。所以,我很乐意很快删除它。但是,就目前而言,信息:Microsoft的标题包含以下信息性评论:

//====== ShellMessageBox ================================================

// If lpcTitle is NULL, the title is taken from hWnd
// If lpcText is NULL, this is assumed to be an Out Of Memory message
// If the selector of lpcTitle or lpcText is NULL, the offset should be a
//     string resource ID
// The variable arguments must all be 32-bit values (even if fewer bits
//     are actually used)
// lpcText (or whatever string resource it causes to be loaded) should
//     be a formatting string similar to wsprintf except that only the
//     following formats are available:
//         %%              formats to a single '%'
//         %nn%s           the nn-th arg is a string which is inserted
//         %nn%ld          the nn-th arg is a DWORD, and formatted decimal
//         %nn%lx          the nn-th arg is a DWORD, and formatted hex
//     note that lengths are allowed on the %s, %ld, and %lx, just
//                         like wsprintf
//

如果这适用于FormatMessage,我不会感到惊讶。

另外,我会查看有关消息编译器和消息资源的文档。

另请参阅FormatMessage的文档,

  

如果您没有类型为va_list*的指针,请指定FORMAT_MESSAGE_ARGUMENT_ARRAY标志并将指针传递给DWORD_PTR值数组;这些值输入到格式化为插入值的消息。每个插入必须在数组中具有相应的元素。