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

Я пытаюсь отладить печать 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: \.

Как я правильно продвигаю его в буфер?

Спасибо.

5
задан BaCaRoZzo 14 May 2015 в 20:04
поделиться

3 ответа

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

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

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

6
ответ дан 18 December 2019 в 09:47
поделиться

Если у вас нет конкретной причины использовать 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);
}
5
ответ дан 18 December 2019 в 09:47
поделиться

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

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

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

6
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: