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

Should I set the Arguments parameter when using FormatMessage to retrieve Windows API error messages?

我正在尝试获取与 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} The exception %s (0x%08lx) occurred in the application at location 0x%08lx.

我假设这可以通过在 FormatMessage 函数中设置 Arguments 参数来解决。但是,我找不到合适的 tutorial/example 来在系统错误消息上设置此参数。我提供的链接将此参数设置为 NULL.

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

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

抱歉,这 理想情况下应该是评论 除了 by-design 缺乏对 SO 技术评论的支持。所以,我很乐意很快删除它。但是,就目前而言,信息:Microsoft 的 headers 包含以下信息性评论:

//====== 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

的文档

If you do not have a pointer of type va_list*, then specify the FORMAT_MESSAGE_ARGUMENT_ARRAY flag and pass a pointer to an array of DWORD_PTR values; those values are input to the message formatted as the insert values. Each insert must have a corresponding element in the array.