需要省略号和 va_args 技巧
TraceMessage 是一个带有变量的 WinAPI 函数参数数量。它是一个跟踪函数,其表示法类似于 printf,在 Windows 跟踪中生成跟踪消息。这里奇怪的部分是它接收格式字符串作为省略号的一部分,而不是作为专用参数。 可以用我自己的函数“覆盖”此函数,然后需要调用 TraceMessageVa (与 TraceMessage 相同,只是使用 va_args 而不是省略号)。
到目前为止,一切都很好;但现在我想使用类似 sprintf 的函数访问跟踪消息,该函数的格式字符串不在省略号中。因此我需要
- 从省略号中获取格式字符串参数;
- 创建一个不带第一个参数的新 va_list。
知道如何做吗?特定于 Visual Studio 编译器的解决方案也是可以接受的。谢谢!
TraceMessage is an WinAPI function with variable number of arguments. It is a tracing function, with a notation similar to printf, which generates a trace message in Windows tracing. The weird part here is that it receive a format string as part of the ellipsis, not as a dedicated argument.
It is possible to 'override' this function with a function of my own, which then needs to call TraceMessageVa (which is the same as TraceMessage, just with va_args rather than ellipsis).
So far so good; but now I want to access the traced message using a sprintf
-like function, which has the format string out of the ellipsis. Thus I need to
- get the format string argument out of the ellipsis ;
- create a new va_list without the first argument.
Any idea about to how do it? Solutions specific to Visual Studio compiler are also acceptable. Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用
va_list
,您可以将其传递给一个函数,该函数在使用va_arg
提取一个或多个参数后,会采用va_list
。然后,va_list
的行为就像它仅“包含”其余参数一样。我对
TraceMessage
本身没有任何经验,但我给出了一个使用标准vprintf
和测试函数的示例。您应该能够适当地适应。例如
With a
va_list
you can pass it to a function which takes ava_list
after having usedva_arg
on it already to have extracted one or more arguments. Theva_list
will then act like it "contains" only the rest of the arguments.I have no experience with
TraceMessage
itself, but I've given an example using standardvprintf
and a test function. You should be able to adapt as appropriate.E.g.