2011-04-23 111 views
3

TraceMessage是一個具有可變參數數量的WinAPI函數。它是一個跟蹤函數,其標記類似於printf,它在Windows跟蹤中生成跟蹤消息。這裏奇怪的部分是它接收到一個格式字符串作爲省略號的一部分,而不是專用的參數。 可以用我自己的函數'覆蓋'這個函數,然後需要調用TraceMessageVa(與TraceMessage相同,只是用va_args而不是省略號)。需要省略號和va_args技巧

到目前爲止這麼好;但是現在我想用類似sprintf的函數訪問跟蹤的消息,該函數的格式字符串不在省略號中。因此我需要
- 從省略號中獲取格式字符串參數;
- 創建一個沒有第一個參數的新va_list。

任何想法如何做到這一點?特定於Visual Studio編譯器的解決方案也是可接受的。謝謝!

+1

TraceMessage的文檔並沒有說它按照你所說的做了。 – 2011-04-23 09:35:43

+0

這是正確的,但你應該相信我,或者只是把它當作一個關於省略號和va_args的問題,不管跟蹤上下文是什麼...... – 2011-04-23 10:29:44

回答

4

隨着va_list你可以將它傳遞到有使用va_arg它已經已提取一個或多個參數後,需要一個va_list的功能。然後,va_list就會像它「僅包含」其餘的參數一樣。

我對TraceMessage本身沒有經驗,但我已經給出了一個使用標準vprintf和測試函數的例子。你應該能夠適當的適應。

E.g.

#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; 
}