sprintf переменная LPCWSTR - PullRequest
       1

sprintf переменная LPCWSTR

5 голосов
/ 14 июня 2010

Я пытаюсь отладить вывод строки LPCWSTR, но у меня возникает проблема во время нажатия sprintf в буфере, поскольку он извлекает только первый символ из строки.

Вот код:

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

Как правильно вставить его в буфер?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 14 июня 2010

Вам нужно сообщить sprintf (), что вы передаете строку широких символов. Используйте спецификатор% ls:

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

Обратите внимание, насколько это непродуктивно. Ваш код работает в операционной системе Unicode. Он должен преобразовать вашу строку char [] обратно в широкую строку, прежде чем он сможет отправить ее в отладчик. Это просто впустую потраченные циклы процессора со значительным риском потери данных при загрузке. Когда вы в Риме, ведите себя как римлянин и используйте wchar_t + wsprintf (). И #define UNICODE, чтобы вы автоматически вызывали быстрый OutputDebugStringW (), который не должен преобразовывать строку. Смысл использования C ++ заключается в написании быстрого кода, намеренно медленное создание которого бессмысленно.

6 голосов
/ 14 июня 2010

Используйте swprintf_s , которая является версией sprintf_s, которая предназначена для широких символов.

Вам также понадобится массив wchar_t вместо char и использование OutputDebugStringW()

Также обратите внимание, что swprintf_w может быть не совсем тем, что вы хотите назвать. Если он встречает строку, которая длиннее размера, который вы ему даете, он выполняет какое-то утверждение. Я предлагаю вам проверить эту ситуацию специально.

5 голосов
/ 14 июня 2010

Если у вас нет конкретной причины нацеливаться на юникод в этой единственной функции (а не, скажем, во всем вашем проекте), возможно, было бы целесообразно использовать макросы, не зависящие от кодировки, где это возможно:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...