2011-04-23 7 views
3

TraceMessageは可変個の引数を持つWinAPI関数です。これは、Windowsトレースでトレースメッセージを生成するprintfに似た表記法を持つトレース機能です。奇妙な部分は、専用の引数ではなく省略記号の一部として書式文字列を受け取ることです。 この関数を自分自身の関数で 'オーバーライド'することができます。これはTraceMessageVa(これはTraceMessageと同じですが、省略記号ではなくva_argsを使用します)を呼び出す必要があります。省略記号とva_argsトリックが必要です

これまでのところとても良いです。今は、sprintfのような関数を使用してトレースされたメッセージにアクセスしたいとします。この関数は、省略記号の外に書式文字列を持ちます。だから私は
する必要があります - 省略形の書式文字列引数を取得します。
- 最初の引数なしで新しいva_listを作成します。

どうすればいいですか? Visual Studioコンパイラ固有のソリューションも使用できます。ありがとう!

+1

TraceMessageのドキュメントでは、あなたが言うことはしません。 –

+0

それは正しいですが、あなたは私を信じるか、またはこれをトレースコンテキストに関係なく、省略記号とva_argsに関する質問として扱うべきです... –

答えて

4

va_listを使用すると、既にva_argを使用して1つまたは複数の引数を抽出した後に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; 
} 
関連する問題