我试图debugging打印一个LPCWSTR
string,但我在缓冲区的sprintf
推入过程中遇到问题,因为它只检索string中的第一个字符。
这里是代码:
HANDLE WINAPI hookedCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { char buffer[1024]; sprintf_s(buffer, 1024, "CreateFileW: %s", lpFileName); OutputDebugString(buffer); return trueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile); }
例如,我得到CreateFileW: C
或CreateFileW: \
。
我如何正确推入缓冲区?
谢谢。
使用swprintf_s ,这是为宽字符字符串设计的sprintf_s的版本。
你还需要一个wchar_t
而不是char
的数组,并使用OutputDebugStringW()
另外,请注意, swprintf_w
可能不是您想调用的内容。 如果遇到一个比你给它大的字符串,它会执行某种断言。 我建议你具体测试这种情况。
你需要告诉sprintf()你传递一个宽字符的字符串。 使用%ls说明符:
sprintf_s(buffer, 1024, "CreateFileW: %ls", lpFileName);
请注意这是多么的无用。 您的代码在Unicode操作系统上运行。 它必须在将char []字符串发送给调试器之前将其转换为宽字符串。 这只是浪费了CPU周期,而且还有数据丢失的风险。 当你在罗马时,像罗马一样行事,使用wchar_t + wsprintf()。 #define UNICODE,这样你就可以自动调用OutputDebugStringW()这个快捷方式,不需要转换字符串。 使用C ++的要点是编写快速的代码,故意制作慢是毫无意义的。
除非你有一个具体的原因来把unicode作为这个函数的目标(而不是在整个项目中),否则尽可能使用字符集不可知的宏是明智的选择:
HANDLE WINAPI hookedCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { TCHAR buffer[1024]; _stprintf_s(buffer, 1024, _T("CreateFileW: %s"), lpFileName); OutputDebugString(buffer); return trueCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwFlagsAndAttributes, dwCreationDisposition, hTemplateFile); }