2010-06-14 121 views
5

我試圖調試打印一個LPCWSTR字符串,但我在緩衝區中的sprintf推送期間遇到問題,因爲它只檢索字符串中的第一個字符。sprintf和LPCWSTR變量

下面是代碼:

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: \

如何正確地將它推入緩衝區?

謝謝。

+1

不應該使用寬字符版本:'wsprintf_s'? – AraK 2010-06-14 14:06:09

回答

6

使用swprintf_s這是爲寬字符字符串設計的sprintf_s版本。

你還需要的wchar_t代替char數組,並使用OutputDebugStringW()

此外,請注意您swprintf_w可能無法才能完全你想叫什麼。如果它遇到一個比你給它大小更長的字符串,它會執行某種斷言。我建議你具體測試這種情況。

5

除非你有一個具體的理由,目標在這種單一功能的Unicode(而不是,比方說,在整個項目),它可能是明智的使用charset無關的宏儘可能:

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); 
} 
6

你需要告訴sprintf()你傳遞一個寬字符串。使用%ls說明符:

sprintf_s(buffer, 1024, "CreateFileW: %ls", lpFileName); 

請注意這是多麼的無用。您的代碼在Unicode操作系統上運行。在將它發送給調試器之前,它必須將您的char []字符串轉換回寬字符串。這只是浪費了CPU週期,導致數據丟失的重大風險。當你在羅馬時,像羅馬人一樣行事,並使用wchar_t + wsprintf()。和#define UNICODE,你將自動調用快速的OutputDebugStringW(),不需要轉換字符串。使用C++的關鍵是寫快速代碼,故意製作慢是毫無意義的。