2010-06-14 10 views
5

Estoy intentando depurar la impresión de una cadena LPCWSTR, pero aparece un problema durante la inserción sprintf en el búfer, porque recupera solo el primer carácter de la cadena.sprintf una variable LPCWSTR

Aquí está el código:

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

Por ejemplo me sale CreateFileW: C o CreateFileW: \.

¿Cómo lo introduzco correctamente en el búfer?

Gracias.

+1

¿No deberías usar la versión wide-char: 'wsprintf_s'? – AraK

Respuesta

6

Use swprintf_s que es la versión de sprintf_s que está diseñada para cadenas de caracteres anchos.

También debes cumplir una serie de wchar_t en lugar de char y utilizar OutputDebugStringW()

Además, tenga en cuenta que swprintf_w que podría no ser entierly lo que desea llamar. Si encuentra una cadena que es más larga que el tamaño que le da, ejecuta algún tipo de afirmación. Sugiero que pruebes esta situación específicamente.

5

menos que tenga una razón concreta para apuntar Unicode en esta sola función (y no, por ejemplo, en todo el proyecto), podría ser una buena idea usar macros charset-agnóstico siempre que sea posible:

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

Usted Necesito decirle a sprintf() que pasas una cadena de caracteres ancha. Use el especificador% ls:

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

Observe cuán improductivo es esto. Su código se ejecuta en un sistema operativo Unicode. Debe convertir su cadena char [] a una cadena ancha antes de poder enviarla al depurador. Eso es solo perder ciclos de CPU con un riesgo significativo de pérdida de datos para arrancar. Cuando estés en Roma, actúa como un romano y usa wchar_t + wsprintf(). Y #define UNICODE para que llame automáticamente a la salida rápida OutputDebugStringW(), la que no tiene que convertir la cadena. El punto de usar C++ es escribir código rápido, hacer intencionalmente es lento no tiene sentido.