3

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

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

关于如何做到这一点的任何想法?特定于 Visual Studio 编译器的解决方案也是可以接受的。谢谢!

4

1 回答 1

4

使用 ava_list您可以将它传递给一个函数,该函数va_list在使用va_arg它已经提取一个或多个参数之后需要 a。然后,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;
}
于 2011-04-23T09:38:05.097 回答