需要省略号和va_args技巧

时间:2011-04-23 09:27:57

标签: c++ winapi visual-c++ tracing etw

TraceMessage是一个WinAPI函数,具有可变数量的参数。它是一个跟踪函数,其表示形式类似于printf,它在Windows跟踪中生成跟踪消息。这里奇怪的部分是它接收格式字符串作为省略号的一部分,而不是作为专用参数。 可以使用我自己的函数“覆盖”此函数,然后需要调用TraceMessageVa(与TraceMessage相同,只需使用va_args而不是省略号)。

到目前为止一切顺利;但现在我想使用类似sprintf的函数来访问跟踪的消息,该函数的格式字符串不在省略号中。因此我需要   - 从省略号中获取格式字符串参数;
  - 创建一个没有第一个参数的新va_list。

有关怎么做的任何想法? Visual Studio编译器特有的解决方案也是可以接受的。谢谢!

1 个答案:

答案 0 :(得分:4)

使用va_list,您可以将其传递给一个函数,该函数在使用va_list之后已经提取了一个或多个参数。然后va_arg将表现为只“包含”其余参数。

我没有使用va_list本身的经验,但我给出了使用标准TraceMessage和测试函数的示例。你应该能够适当地适应。

E.g。

vprintf