2010-06-14 13 views
5

Sto tentando di eseguire il debug di stampa una stringa LPCWSTR, ma durante il push sprintf si verifica un problema nel buffer, poiché recupera solo il primo carattere dalla stringa.sprintf una variabile LPCWSTR

Ecco il codice:

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

Per esempio ottengo CreateFileW: C o CreateFileW: \.

Come inserirlo correttamente nel buffer?

Grazie.

+1

Non dovresti usare la versione wide-char: 'wsprintf_s'? – AraK

risposta

6

Utilizzare swprintf_s che è la versione di sprintf_s progettata per stringhe di caratteri ampi.

Avrete anche bisogno di una serie di wchar_t invece di char e di utilizzare OutputDebugStringW()

Si noti inoltre che swprintf_w potrebbe non essere entierly ciò che si desidera chiamare. Se incontra una stringa che è più lunga della dimensione che gli dai, esegue una sorta di asserzione. Ti suggerisco di testare specificamente questa situazione.

5

Se non avete una ragione concreta di indirizzare unicode in questa singola funzione (e non, per esempio, nel vostro intero progetto), potrebbe essere saggio usare le macro charset-agnostic per quanto possibile:

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

È devi dire a sprintf() che passi una stringa di caratteri estesa. Utilizza lo specificatore% ls:

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

Annotare quanto è improduttivo. Il tuo codice funziona su un sistema operativo Unicode. È necessario convertire la stringa char [] in una stringa ampia prima di poterla inviare al debugger. Questo è solo spreco di cicli di CPU con un rischio significativo di perdita di dati per l'avvio. Quando sei a Roma, agisci come un romano e usa wchar_t + wsprintf(). E #define UNICODE in modo da chiamare automaticamente il veloce OutputDebugStringW(), quello che non ha bisogno di convertire la stringa. Il punto di usare C++ è scrivere codice veloce, fare intenzionalmente è lento è inutile.