4

ユーザーが差し込んだばかりの USB 大容量記憶装置のデバイス インスタンス ID (一意の ID) をプログラムで取得する方法は?

4

2 に答える 2

2

デバイス変更通知を登録して、任意のウィンドウ ハンドルから 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);

WM_DEVICECHANGE の lParam は、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");
                }
            }
        ....
于 2010-06-17T01:30:27.673 に答える
1

WMIでできると思います。クラスを調べWin32_LogicalDiskToPartitionてすべてのディスク名のリストを取得し、それらの名前を使用してクラスWin32_DiskDriveとそのPNPDeviceIDプロパティを照会します。

実際、より良い手順とそれを行う素晴らしいクラスについては、ここを参照してください。

于 2010-06-16T07:43:09.480 に答える