SetupDiGetDeviceInterfaceDetail 函数

 SetupDiGetDeviceInterfaceDetail

该函数返回设备接口的详细信息。

WINSETUPAPI BOOL WINAPI
SetupDiGetDeviceInterfaceDetail(
IN HDEVINFO  DeviceInfoSet,
IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData,
OUT PSP_DEVICE_INTERFACE_DETAIL_DATA  DeviceInterfaceDetailData..OPTIONAL,
IN DWORD  DeviceInterfaceDetailDataSize,
OUT PDWORD  RequiredSize..OPTIONAL,
OUT PSP_DEVINFO_DATA  DeviceInfoData  OPTIONAL
);

参数

DeviceInfoSet

指向设备信息集的指针,它包含了所要接收信息的接口。该句柄通常由SetupDiGetClassDevs函数返回。

DeviceInterfaceData

一个指向 SP_DEVICE_INTERFACE_DATA结构的指针,该结构指定了 DeviceInfoSet 参数中设备的接口。这个类型的指针通常由 SetupDiEnumDeviceInterfaces 函数返回。

DeviceInterfaceDetailData

一个指向SP_DEVICE_INTERFACE_DETAIL_DATA结构的指针,该结构用于接收指定接口的信息。该参数是可选的且可以为NULL。如果DeviceInterfaceDetailSize 参数为0,该参数必须为NULL。如果该参数被指定,主调者必须在调用该函数之前,设置 SP_DEVICE_INTERFACE_DETAIL_DATA 结构的 cbSize 成员为 sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)。cbSize 成员总是包含数据结构的固定部分的长度。

DeviceInterfaceDetailDataSize

DeviceInterfaceDetailData 参数指定的缓冲的大小。该缓冲的大小不能小于 (offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath) + sizeof(TCHAR)) 字节。
如果 DeviceInterfaceDetailData 参数为NULL,该参数必须为0.

RequiredSize

一个指向变量的指针,该变量接收请求的 DeviceInterfaceDetailData 缓冲的大小。这个大小包含了结构的固定部分的大小再加上设备路径字符串的长度。该参数是可选的,也可以是NULL。

DeviceInfoData

一个指向缓冲的指针,该缓冲接收关于支持请求的接口的设备的信息。主调者必须设置 DeviceInfoData.cbSize 成员为 sizeof(SP_DEVINFO_DATA)。该参数是可选的,也可以为NULL。

返回值

如果函数顺利完成,则返回TRUE,如果有错误,则返回FALSE。

备注

使用该函数来获得接口的细节,通常需要两个步骤:

1、获得请求的缓冲大小。Call SetupDiGetDeviceInterfaceDetail with a NULL DeviceInterfaceDetailData pointer, a DeviceInterfaceDetailDataSize of zero, and a valid RequiredSize variable. In response to such a call, this function returns the required buffer size at RequiredSize and fails with GetLastError returning ERROR_INSUFFICIENT_BUFFER.

2、分配一个合适的缓冲并再次调用函数来获得接口细节。

由该函数返回的接口细节包括设备路径。不要试图解析设备路径符号名字。设备路径可以跨系统重用。

该函数可以被用来获得DeviceInfoData。如果接口存在,但DeviceInterfaceDetailData 为NULL,该函数会失败。

要求

Versions: The SetupDiGetDeviceInterfaceDetail function is available in Microsoft Windows 2000 and later versions of Windows.

Headers: Declared in Setupapi.h. Include Setupapi.h.

Library: Contained in Setupapi.lib. Link to Setupapi.lib.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Delphi可以使用Windows API函数来判断USB设备。首先要使用SetupDiGetClassDevs函数获取设备信息,然后使用SetupDiEnumDeviceInterfaces函数枚举设备接口,使用SetupDiGetDeviceInterfaceDetail函数获取接口详细信息。可以根据接口信息判断设备是否为USB设备。 以下是一个简单的示例代码: 1.声明函数 声明Windows API函数,包括 SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail函数。 2. 获取设备信息 使用SetupDiGetClassDevs函数获取设备信息。需要传递两个参数,第一个参数是GUID,表示要查找的设备类型;第二个参数为NULL,表示查找所有可用的设备。返回值为设备信息的句柄。 3. 枚举设备接口 使用SetupDiEnumDeviceInterfaces函数枚举设备接口,需要传递三个参数,第一个参数是设备信息的句柄,第二个参数是设备描述符,第三个参数是接口GUID。 4. 获取接口信息 使用SetupDiGetDeviceInterfaceDetail函数获取接口详细信息,需要传递三个参数,第一个参数是设备信息的句柄,第二个参数是接口描述符,第三个参数是接口详细信息结构体。 5. 判断是否为USB设备 根据接口详细信息结构体来判断设备是否为USB设备。 示例代码: //获取设备信息 hDevInfo := SetupDiGetClassDevs(@GUID_DEVCLASS_USB, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE); if hDevInfo = INVALID_HANDLE_VALUE then begin ShowMessage('SetupDiGetClassDevs failed.'); Exit; end; //枚举设备接口 devInterfaceData.cbSize := SizeOf(devInterfaceData); index := 0; while SetupDiEnumDeviceInterfaces(hDevInfo, nil, GUID_DEVINTERFACE_USB_DEVICE, index, devInterfaceData) do begin //获取接口详细信息 if not SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInterfaceData, nil, 0, @requiredSize, nil) then begin if GetLastError = ERROR_INSUFFICIENT_BUFFER then begin mem := AllocMem(requiredSize); devInterfaceDetailData.cbSize := SizeOf(devInterfaceDetailData); if not SetupDiGetDeviceInterfaceDetail(hDevInfo, @devInterfaceData, mem, requiredSize, @requiredSize, @devInfoData) then begin ShowMessage('SetupDiGetDeviceInterfaceDetail failed.'); end else begin //判断是否为USB设备 if devInterfaceDetailData.DevicePath.IndexOf('USB') >= 0 then begin //是USB设备 end; end; FreeMem(mem); end; end; Inc(index); end; //释放设备信息句柄 SetupDiDestroyDeviceInfoList(hDevInfo); 以上就是使用Delphi判断USB设备的简单方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值