【问题标题】:Ellipsis and va_args trick needed需要省略号和 va_args 技巧
【发布时间】:2011-04-23 09:27:56
【问题描述】:

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

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

知道怎么做吗?特定于 Visual Studio 编译器的解决方案也是可以接受的。谢谢!

【问题讨论】:

  • TraceMessage 的文档并没有说它按照你说的做。
  • 这是正确的,但你应该相信我,或者只是将其视为关于省略号和 va_args 的问题,无论跟踪上下文如何......

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


【解决方案1】:

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

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

例如

#include <stdio.h>
#include <stdarg.h>

void test(int a, ...)
{
    va_list va;
    const char* x;

    va_start(va, a);
    x = va_arg(va, const char*);

    vprintf(x, va);

    va_end(va);
}

int main(void)
{
    test(5, "%d\n", 6);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多