Когда я запускаю код C++, я всегда получаю ошибку Visual Studio C2664.

Когда я использую этот код

if (GetKeyNameText(Key << 16, NameBuffer, 127))
{
    KeyName = NameBuffer;
    GoodKeyName = true;
}

Я получаю следующую ошибку

C2664 'int GetKeyNameTextW (LONG, LPWSTR, int)': невозможно преобразовать аргумент 2 из 'char [128]' в 'LPWSTR'

NameBuffer говорит следующее:

Ошибка: аргумент типа "char*" несовместим с параметром типа "LPWSTR"

Какие-нибудь советы?


person Hanzki    schedule 31.03.2016    source источник
comment
msdn.microsoft.com/en-us/library /   -  person OldProgrammer    schedule 31.03.2016
comment
где вы определили NameBuffer?   -  person usamazf    schedule 31.03.2016


Ответы (1)


Вы определили UNICODE, что означает, что все ваши функции и TCHAR и LPTSTR по умолчанию используют широкие символы (wchar_t).

Это означает, что вы не можете использовать строку с узкими символами (используя char) без особой осторожности.

Существует простое решение — явно вызвать узкосимвольную версию функции: GetKeyNameTextA.

Другое решение — прекратить использование char и перейти на TCHAR и родственные типы, а также использовать макрос T для строковых литералов.

Вы можете узнать больше о UNICODE в Windows API.

person Some programmer dude    schedule 31.03.2016
comment
гм, LPWSTR всегда wchar_t* - person NathanOliver; 31.03.2016
comment
@NathanOliver Макрос UNICODE заставляет GetKeyNameText быть псевдонимом (на самом деле макросом) для GetKeyNameTextW, который явно использует LPWSTR. Если вы видите ссылку GetKeyNameText он использует LPTSTR, который определяется как LPWSTR, если определен UNICODE (и узкий символ LPSTR в противном случае). - person Some programmer dude; 31.03.2016
comment
Ой. Я не видел, чтобы функция действительно использовала LPTSTR. Я только что увидел LPWSTR из Q. Кстати, я не голосующий против. - person NathanOliver; 31.03.2016
comment
@NathanOliver Легкая ошибка. :) О, и я стараюсь не беспокоиться (слишком!) о минусах. Если кто-то считает мой ответ плохим, это их право так проголосовать. :) - person Some programmer dude; 31.03.2016