2016-03-31 17 views
0

Wenn ich diesen Code verwendenC++ Visual Studio Fehler C2664

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

ich folgende Fehlermeldung

C2664 'int GetKeyNameTextW(LONG,LPWSTR,int)': cannot convert argument 2 from 'char [128]' to 'LPWSTR'

Die NameBuffer sagt diese:

Error: argument of type "char*" is incompatible with parameter of type "LPWSTR"

Irgendwelche Tipps?

+0

https://msdn.microsoft.com/en-us/library/cc230355.aspx?f=255&MSPPError=-2147217396 – OldProgrammer

+0

wo haben Sie NameBuffer definiert? –

Antwort

2

Sie UNICODE definiert haben, welche alle Funktionen bedeutet und TCHAR und LPTSTR-breit Zeichen säumige (wchar_t).

Das bedeutet, dass Sie eine schmale Zeichenkette (unter Verwendung von char) nicht ohne besondere Vorsicht verwenden können.

Es gibt eine einfache Lösung, und das heißt, die Narrow-Character-Version der Funktion explizit aufzurufen: GetKeyNameTextA.

Eine andere Lösung ist mit char und wechseln Sie in TCHAR und verwandte Arten zu stoppen, und verwenden Sie die T Makro für Stringliterale.

Sie möchten vielleicht mehr über UNICODE in the Windows API lesen.

+0

um, ein 'LPWSTR' ist immer ein' wchar_t * ' – NathanOliver

+1

@NathanOliver Das' UNICODE' Makro bewirkt, dass 'GetKeyNameText' ein Alias ​​(ein Makro wirklich) für' GetKeyNameTextW' ist, der explizit 'LPWSTR' verwendet. Wenn Sie [die 'GetKeyNameText'-Referenz] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646300%28v=vs.85%29.aspx) sehen, wird 'LPTSTR' verwendet definiert als "LPWSTR", wenn "UNICODE" definiert ist (und ansonsten das schmale Zeichen "LPSTR"). –

+0

Oh. Ich habe nicht gesehen, dass die Funktion tatsächlich einen 'LPTSTR' verwendet. Ich sah gerade den "LPWSTR" von der Q. Ich bin nicht der Downvoter. – NathanOliver