Получение идентификатора экземпляра USB-накопителя (уникальный идентификатор) программным способом - PullRequest
4 голосов
/ 16 июня 2010

Когда пользователь подключает запоминающее устройство USB, как программно получить идентификатор экземпляра устройства (уникальный идентификатор) этого конкретного устройства?

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Поймать WM_DEVICECHANGE из любого дескриптора окна, зарегистрировавшись для уведомлений об изменении устройства. Как таковой:

DEV_BROADCAST_DEVICEINTERFACE dbd = { sizeof(dbd) };
dbd.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
dbd.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;
RegisterDeviceNotification(hwnd, &dbd, DEVICE_NOTIFY_WINDOW_HANDLE);

lParam WM_DEVICECHANGE может быть приведен к DBT_DEVTYP_DEVICEINTERFACE. Примечание: при подключении устройства вы можете получить несколько уведомлений WM_DEVICECHANGE. Просто отфильтруйте событие прибытия и игнорируйте дубликаты.

LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(hwnd)
    {
        case WM_DEVICE_CHANGE:
        {
            PDEV_BROADCAST_HDR pHdr = NULL;
            PDEV_BROADCAST_DEVICEINTERFACE pDev = NULL;
            pHdr = (PDEV_BROADCAST_HDR)lParam;
            bool fDeviceArrival = (wParam == DBT_DEVICEARRIVAL);
            if (fDeviceArrival)
            {
                if (pHdr && (pHdr->dbch_devicetype==DBT_DEVTYP_DEVICEINTERFACE))
                {
                    pDev = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
                }
                if (pDev && (pDev->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE))
                {
                    // the PNP string of the device just plugged is in dbcc_name
                    OutputDebugString(pDev->dbcc_name);
                    OutputDebugString("\r\n");
                }
            }
        ....
1 голос
/ 16 июня 2010

Я думаю, что вы можете сделать это с помощью WMI.Посмотрите на класс Win32_LogicalDiskToPartition, чтобы получить список всех имен дисков, а затем используйте эти имена для запроса класса Win32_DiskDrive и его свойства PNPDeviceID.

На самом деле, посмотрите здесь за лучшие инструкции и хороший класс, который делает это для вас.

...