В Windows существует два вида вызовов API: Unicode и ANSI.Первый принимает и возвращает строки Unicode в кодировке UTF-16;последний принимает и возвращает 8-битные кодированные строки (точное кодирование зависит от локализации ОС).
Вы выбираете, какой вариант вы хотите использовать, #defining (или не #defining) макрос UNICODE
.В зависимости от этого функция меняет имя с суффиксом W
или A
.
#ifdef UNICODE
#define GetRawInputDeviceInfo GetRawInputDeviceInfoW
#else
#define GetRawInputDeviceInfo GetRawInputDeviceInfoA
#endif
Все структуры, которые могут содержать текстовые данные, также дублируются с суффиксами W
или A
.
Теперь ваша проблема: вы не определяете UNICODE
, поэтому вы на самом деле вызываете GetRawInputDeviceInfoA()
, вариант ANSI, который ожидает char*
, но вы передаете WCHAR*
, то есть UNICODEstring!
Решение простое:
char* wcDeviceName = new char[nBufferSize + 1];
К сожалению, аргументы этой функции GetRawInputDeviceInfo()
перегружены, поэтому она объявлена как принимающая void*
, поэтому компиляторне могу поймать ошибку.Если бы вы вызывали более простую функцию, скажем, SetWindowText()
, то вы бы получили ошибку компилятора из-за несовместимого типа указателя.
Если вы действительно хотите полное имя UNICODE устройства, вы можете оставить WCHAR
string и затем вызвать функцию UNICODE, в частности:
WCHAR* wcDeviceName = new WCHAR[nBufferSize + 1];
...
GetRawInputDeviceInfoW(..., RIDI_DEVICENAME, wcDeviceName, ...);