MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Вывод имени USB-девайса"
Answer 888021
У вас не из той структуры значение берется. Да и значение в структуре на самом деле не имя устройства, а путь к нему. Имя устройства еще нужно искать (проще всего, через реестр). Как-то так:
#include <Windows.h> #include "dbt.h" #include "initguid.h" #include "usbiodef.h" //... HDEVNOTIFY NotificationHande; DEV_BROADCAST_DEVICEINTERFACE DeviceStruct; //получение имени устройства bool GetDeviceName(const wchar_t* symlink, wchar_t* name, int cname) { if(symlink == NULL) return false; if (name == NULL) return false; if (wcslen(symlink) < 10) return false; //распарсим путь к устройству на составляющие const wchar_t* pEnum = symlink + 3; const wchar_t* pDeviceID = wcsstr(symlink, L"#"); if(pDeviceID == NULL) return false; int lenEnum = pDeviceID - pEnum; pDeviceID++; const wchar_t* pInstID = wcsstr(pDeviceID, L"#"); if (pInstID == NULL) return false; int lenDeviceID = pInstID - pDeviceID; pInstID++; const wchar_t* pEnd = wcsstr(pInstID, L"#"); if (pEnd == NULL) return false; int lenInstID = pEnd - pInstID; //соберем из них путь к ключу реестра wchar_t path[1024] = L"SYSTEM\\CurrentControlSet\\Enum"; wcsncat_s(path, 1024, pEnum, lenEnum); wcsncat_s(path, 1024, L"\\", 1); wcsncat_s(path, 1024, pDeviceID, lenDeviceID); wcsncat_s(path, 1024, L"\\", 1); wcsncat_s(path, 1024, pInstID, lenInstID); //попытаемся получить имя или описание устройства из реестра HKEY hKey = NULL; LONG lRes = RegOpenKeyExW(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &hKey); if (ERROR_SUCCESS != lRes) { return false; } WCHAR szBuffer[1024] = L""; DWORD dwBufferSize = sizeof(szBuffer); lRes = RegQueryValueExW(hKey, L"FriendlyName", 0, NULL, (LPBYTE)szBuffer, &dwBufferSize); if (ERROR_SUCCESS != lRes) { dwBufferSize = sizeof(szBuffer); lRes = RegQueryValueExW(hKey, L"DeviceDesc", 0, NULL, (LPBYTE)szBuffer, &dwBufferSize); } if (ERROR_SUCCESS != lRes) { RegCloseKey(hKey); return false; } wcscpy_s(name, cname, szBuffer); return true; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { DeviceStruct.dbcc_size = sizeof(DeviceStruct); DeviceStruct.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; DeviceStruct.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; NotificationHande = RegisterDeviceNotification(hWnd, &DeviceStruct, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); } break; case WM_DEVICECHANGE: if (wParam == DBT_DEVICEARRIVAL) { DEV_BROADCAST_HDR* NewDevice = (DEV_BROADCAST_HDR*)lParam; if (NewDevice->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { DEV_BROADCAST_DEVICEINTERFACE* pDev = (DEV_BROADCAST_DEVICEINTERFACE*)lParam; WCHAR name[1024] = L""; if(GetDeviceName(pDev->dbcc_name, name, 1024) != false) MessageBoxW(hWnd, name, L"Device", MB_OK); else MessageBoxW(hWnd, pDev->dbcc_name, L"Device", MB_OK); } } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.