sprintf一个LPCWSTRvariables

我试图debugging打印一个LPCWSTRstring,但我在缓冲区的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: CCreateFileW: \

我如何正确推入缓冲区?

谢谢。

使用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); }