Ошибка ReadConsoleOutputCharacter с использованием второго параметра - PullRequest
1 голос
/ 26 октября 2011

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684969(v=vs.85).aspx ошибка C2664: «ReadConsoleOutputCharacterW»: невозможно преобразовать параметр 2 из «char *» в «LPWSTR»

#include <windows.h>
#include <stdio.h>

int main(void)
{
    HANDLE hOut;
    char letter;
    char letters[5];
    DWORD numberRead;
    COORD where_;

    SetConsoleTitle(L"Hello!");
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    where_.X = 0;
    where_.Y = 0;
    ReadConsoleOutputCharacter(hOut, &letter, 1, where_, &numberRead);
    printf("letter at (0,0) is %c letter", letter);
    return 0;
}

1 Ответ

2 голосов
/ 26 октября 2011

Похоже, вы компилируете с включенной поддержкой юникода (потому что ReadConsoleOutputCharacter разрешается в ReadConsoleOutputCharacterW, в противном случае он разрешается в ReadConsoleOutputCharacterA).

Это означает, что все строки и символы используются с любыми функциями WinAPIдолжны быть широкими символами WCHAR вместо char и LPWSTR вместо LPSTR, .... Или вы отключаете Юникод, отменяя определение соответствующих символов препроцессора (UNICODE и _UNICODE, я думаю).Но в этом случае ваш SetConsoleTitle вызов больше не будет работать, поскольку вы явно передаете ему широкую строку.

Но наиболее гибким будет использование TCHAR вместо char и LPTSTRвместо LPSTR и тому подобное.Они просто определены для правильных типов в зависимости от определения символа препроцессора UNICODE.В этом случае код остается широко независимым от поддержки юникода.Но в этом случае вы должны заключить все строковые литералы в макрос _T, T или TEXT:

//non-unicode
const char *str = "something";

//unicode
const WCHAR *str = L"something";

//unicode-agnostic
const TCHAR *str = _T("something");

См. здесь для ознакомления с проблемой.

Если вам действительно не нужна поддержка юникода и вам нужны только некоторые простые функции WinAPI и вы хотите, чтобы они хорошо взаимодействовали со стандартной библиотекой C (как в вашем случае это кажется), лучше всего простоundefine UNICODE и _UNICODE и используйте стандартные char s.В этом случае также удалите модификатор L из строковых литералов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...