1.添加对象/库模块“setupapi.lib ”
2.包含头文件“winioctl.h”
3.包含头文件“initguid.h”
4.包含头文件“setupapi.h"
5.添加宏定义"DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);";
6.添加宏定义“#define INTERFACE_DETAIL_SIZE (1024)”;
7.添加代码:
CString CMyDlg::GetDevicePath(LPGUID lpGuid)
{
int nCount;
CString Sdn;
HDEVINFO hDevInfoSet;
SP_DEVICE_INTERFACE_DATA ifdata;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
BOOL bResult; // 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID
NULL, // 无关键字
NULL, // 不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
{
AfxMessageBox("获取相关的设备信息集GUID句柄失败!");
} // 申请设备接口数据空间
else
{
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
nCount = 0;
bResult = TRUE; // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
while (bResult)
{
ifdata.cbSize = sizeof(ifdata); // 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces( hDevInfoSet, // 设备信息集句柄
NULL, // 不需额外的设备描述
lpGuid, // GUID
(ULONG)nCount, // 设备信息集里的设备序号
&ifdata); // 设备接口信息
if (bResult)
{
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail( hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
pDetail, // 设备接口细节(设备路径)
INTERFACE_DETAIL_SIZE, // 输出缓冲区大小
NULL, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述
if (bResult)
{
// 复制设备路径到输出缓冲区
Sdn=pDetail->DevicePath;
// 调整计数值
nCount++;
AfxMessageBox(Sdn);//用于调试用
}
}
}
// 释放设备接口数据空间
::GlobalFree(pDetail); // 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
}
return Sdn;//包含设备ID的字符串
}
函数调用如下:
GetDevicePath((LPGUID)&UsbClassGuid);