私はテキスト文字列をテキスト(ログ)ファイルの最後に付加する低レベルのロガー関数を書いています。必要なのは、この関数は、DllMainハンドラから呼び出されたときなど、プロセスでまだ使用できない可能性のあるDLLからすべてのWinAPIをで呼び出すべきではないということです。つまり、ユーザーモードプロセスにロードされることが保証されているライブラリ以外のライブラリ、つまりkernel32.dll
またはntdll.dll
を使用することはできません。kernel32.dllやntdll.dllのような低レベルライブラリのwsprintf()型関数はありますか?
私はkernel32.dll
からのすべてであることなど、HeapFree
、HeapAlloc
、CloseHandle
、ちょうどCreateFile
、WriteFile
で非常にうまくにより取得することができました。
問題は、出力文字列の書式設定です。たとえば、現時点、プロセスID、セッションIDなどの追加の(自動生成された)詳細を追加する必要があります。私は通常wsprintf
型の関数を使用します。つまり、StringCchPrintf
を正確に使用します。
StringCchPrintf(buffer, buffer_size, L"%04u-%02u-%02u %02u:%02u:%02u pid=0x%x, sessID=%d, %s\r\n", /* parameters */);
しかし、これらのAPIは上記のルールに違反しています。
低レベルのprintf
タイプの書式設定APIが利用可能な場合は、誰でも知っていますか?
* sprintfとswprintfを* ntdll *からエクスポートしました。あなたは自由にそれを使うことができます。唯一の制限 - それは浮動小数点形式をサポートしていません – RbMm
@RbMm:うーん、興味深いのは、それらがCRT機能だと思った。あなたはどこからそれを取るのですか?また、私がfloat形式を使用するとどうなりますか? – c00000fd
ntdllは '%f'や'%g'を使うならば、この2だけでなく、 '_snprintf'、' _snwprintf'、 '_vsnprintf'、' _vsnwprintf'などほとんどの文字列フォーマット関数をサポートしています。処理してください – RbMm