W32-registerdevicenotification - dev_broadcast_deviceinterface - ansi против unicode
Уважаемые Эксперты
Я должен добавить небольшое расширение к устаревшему приложению. Расширение просто подключается к приезду USB-устройства.
Поэтому я зарегистрировал свое главное окно для получения уведомлений:
Файл MainWindow конструктор
{ // Register me to receive device Change notifications DEV_BROADCAST_DEVICEINTERFACE xNotificationFilter; memset(&xNotificationFilter, 0, sizeof(xNotificationFilter)); xNotificationFilter.dbcc_size= sizeof(xNotificationFilter); xNotificationFilter.dbcc_devicetype= DBT_DEVTYP_DEVICEINTERFACE; xNotificationFilter.dbcc_classguid= GUID_DEVINTERFACE_USB_DEVICE; mHDEVNOTIFY= RegisterDeviceNotification(Handle, &xNotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE); }
и сделайте это, чтобы справиться с событием:
{ if (Message.WParam == DBT_DEVICEARRIVAL) { PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)Message.LParam; if (lpdb -> dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { PDEV_BROADCAST_DEVICEINTERFACE xDevIntf= (PDEV_BROADCAST_DEVICEINTERFACE)Message.LParam; if(xDevIntf->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE) { // // -------- Here my confusion. dbcc_name is TCHAR even my app is "ANSI" -------------- // wchar_t* xNameW= (wchar_t*)xDevIntf->dbcc_name; AnsiString xName= WideString(xNameW); // \\?\USB#VID_0000&PID_0000#5&1835e82d&0&3#{a5dcbf10-...." // LogMsg(xName); } } } }
В принципе все работает нормально но в одном пункте у меня есть сомнения:
По словам госпожи Структура DEV_BROADCAST_DEVICEINTERFACE (Windows)[^] dbcc_name структура DEV_BROADCAST_DEVICEINTERFACE должна быть возвращена как ANSI char* для "ANSI Apps", по крайней мере, она описана таким образом.
Но то, что я вижу, это то, что dbcc_name всегда возвращается в Юникоде.
Я пробовал также явно RegisterDeviceNotificationA но то же самое, dbcc_name возвращается как Unicode.
Кто-нибудь может подтвердить это или указать, где я ошибаюсь, что я упускаю?
Заранее большое вам спасибо.
[Edit]кстати, это определяется dbt. h:
#if(WINVER >= 0x040A) typedef struct _DEV_BROADCAST_DEVICEINTERFACE_A { DWORD dbcc_size; DWORD dbcc_devicetype; DWORD dbcc_reserved; GUID dbcc_classguid; char dbcc_name[1]; } DEV_BROADCAST_DEVICEINTERFACE_A, *PDEV_BROADCAST_DEVICEINTERFACE_A; typedef struct _DEV_BROADCAST_DEVICEINTERFACE_W { DWORD dbcc_size; DWORD dbcc_devicetype; DWORD dbcc_reserved; GUID dbcc_classguid; wchar_t dbcc_name[1]; } DEV_BROADCAST_DEVICEINTERFACE_W, *PDEV_BROADCAST_DEVICEINTERFACE_W;
Что я уже пробовал:
Я описал выше то, что я пробовал. "Что вы пробовали" - это ужасная новая функция....