我正在编写一个低级记录器函数,该函数将文本字符串附加到文本(日志)文件的末尾。要求是此函数不应从该进程可能尚不可用的DLL调用的任何WinAPI(例如,从DllMain处理程序调用时)。换句话说,除了保证可以加载到任何用户模式进程中的库之外,它不能使用任何其他库,即kernel32.dll
或ntdll.dll
。
仅通过CreateFile
的WriteFile
,CloseHandle
,HeapAlloc
,HeapFree
,kernel32.dll
等,我就能很好地相处。
问题是格式化输出字符串。例如,我需要添加一些其他(自动生成的)详细信息,例如当前时间,进程ID, session 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? 最佳答案
所有版本的ntdll.dll都支持最小的next(来自xp)字符串格式化功能:
_snprintf
_snwprintf
_vsnprintf
_vsnwprintf
sprintf
swprintf
vsprintf
当然,完整的签名与crt中的相同功能匹配。我们可以免费使用此api。新版本的ntdll添加了一些新格式的字符串api。再说win7(和所有最新版本)ntdll.dll导出:
_snprintf
_snprintf_s
_snwprintf
_snwprintf_s
_swprintf
_vscwprintf
_vsnprintf
_vsnprintf_s
_vsnwprintf
_vsnwprintf_s
_vswprintf
swprintf
swprintf_s
vsprintf
vsprintf_s
vswprintf_s
关于c - 是否存在来自低级库(例如kernel32.dll或ntdll.dll)的wsprintf()类型的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46857294/