我正在寫一個低級別的記錄器函數,它將文本字符串追加到文本(日誌)文件的末尾。要求是這個函數不應該調用來自DLL的任何WinAPI,這些DLL可能還不能用於該進程 - 例如當它從一個DllMain處理程序調用時。換句話說,它不能使用除保證被加載到任何用戶模式進程中的庫之外的任何庫,即kernel32.dll
或ntdll.dll
。從低級庫(如kernel32.dll或ntdll.dll)是否有wsprintf()類型的函數?
我能夠很好地與剛剛CreateFile
,WriteFile
,CloseHandle
,HeapAlloc
,HeapFree
等,其均來自kernel32.dll
得到。
問題是格式化輸出字符串。例如,我需要添加一些額外的(自動生成的)詳細信息,例如當前時間,進程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的功能。你從哪裏拿?還有,如果我使用浮點格式會發生什麼? – c00000fd
ntdll支持幾乎所有的字符串格式化函數,不僅是這2個,而且還有'_snprintf','_snwprintf','_vsnprintf','_vsnwprintf',..如果你要使用'%f'或'%g' - 它根本不支持處理它 – RbMm