使用 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.
我正在尝试获取与 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 theFORMAT_MESSAGE_ARGUMENT_ARRAY
flag and pass a pointer to an array ofDWORD_PTR
values; those values are input to the message formatted as the insert values. Each insert must have a corresponding element in the array.