首页 > 用win32 API如何取得已插入U盘的盘符

用win32 API如何取得已插入U盘的盘符

查了些资料,不能使用GetDriverType(),因为它返回DRIVE_REMOVABLE时表示的也可能是软驱

MSDN上说:

To determine whether a drive is a USB-type drive, call SetupDiGetDeviceRegistryProperty and specify the SPDRP_REMOVAL_POLICY property.

但是因为之前没有这方面的经验,好些概念都不明白,所以看不懂。

如果有详细点的说明,对我会有很大帮助,谢谢。


http://banderlogi.blogspot.com/2011/06/enum-drive-letters-attached-for-usb.html

我想代码应该挺清楚了。。

bool IsUsbDevice( wchar_t letter )
 {
  wchar_t volumeAccessPath[] = L"\\\\.\\X:";
  volumeAccessPath[4] = letter;

  HANDLE deviceHandle = CreateFileW(
   volumeAccessPath,
   0,                // no access to the drive
   FILE_SHARE_READ | // share mode
   FILE_SHARE_WRITE, 
   NULL,             // default security attributes
   OPEN_EXISTING,    // disposition
   0,                // file attributes
   NULL);            // do not copy file attributes

  // setup query
  STORAGE_PROPERTY_QUERY query;
  memset(&query, 0, sizeof(query));
  query.PropertyId = StorageDeviceProperty;
  query.QueryType = PropertyStandardQuery;

  // issue query
  DWORD bytes;
  STORAGE_DEVICE_DESCRIPTOR devd;
  STORAGE_BUS_TYPE busType = BusTypeUnknown;

  if (DeviceIoControl(deviceHandle,
   IOCTL_STORAGE_QUERY_PROPERTY,
   &query, sizeof(query),
   &devd, sizeof(devd),
   &bytes, NULL))
  {
   busType = devd.BusType;
  }
  else
  {
   std::wcout << L"Failed to define bus type for: " << letter;
  }

  CloseHandle(deviceHandle);

  return BusTypeUsb == busType;
 }

另外msdn那种说法应该是这个?
来自:http://stackoverflow.com/questions/220123/how-do-i-detected-whether-a-hard-drive-is-connected-via-usb#answer-223808

#include "stdafx.h"
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
extern "C" __declspec(dllexport) int usb_hard_drives() {
  HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, DIGCF_PRESENT);
  if (hdevinfo == INVALID_HANDLE_VALUE) return -1;
  DWORD MemberIndex = 0;
  SP_DEVINFO_DATA sp_devinfo_data;
  ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
  sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
  int c = 0;
  while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    DWORD PropertyBuffer;
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_CAPABILITIES, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
      if (PropertyBuffer && CM_DEVCAP_REMOVABLE == CM_DEVCAP_REMOVABLE) {
        // do something here to identify the drive letter.
        c++;
      }
    }       
    MemberIndex++;
  }
  SetupDiDestroyDeviceInfoList(hdevinfo);
  return c;
}
【热门文章】
【热门文章】