请教:关于获取USB设备的制造厂商、设备型号等信息

sych11 2014-11-25 09:29:40
http://www.cnblogs.com/lzjsky/archive/2010/11/19/1881939.html
这是VC++的代码,俺看不懂,有懂的朋友麻烦给补充一下,下面的是整理后的代码只差最后一步了
Clear
Local ans, DeviceNumber, DiskGUID, hSetup, Success, i, dia, da, didd
#Define GUID_DEVINTERFACE_USB_DEVICE "A5DCBF10-6530-11D2-901F-00C04FB951ED"
#Define INVALID_HANDLE_VALUE -1
#Define BUFFER_SIZE 2048
#Define REG_SZ 1
#Define GENERIC_WRITE 0x40000000
#Define FILE_SHARE_WRITE 0x2
#Define OPEN_EXISTING 0x3
#Define FILE_ATTRIBUTE_NORMAL 128
#Define DIGCF_PRESENT 0x2
#Define DIGCF_DEVICEINTERFACE 0x10
Declare Integer SetupDiGetClassDevs In "setupapi.dll" ;
String @ClassGuid, ;
Integer Enumerator, ;
Integer hwndParent, ;
Integer Flags
Declare Integer SetupDiEnumDeviceInterfaces In "setupapi.dll" ;
Integer DeviceInfoSet, ;
Integer DeviceInfoData, ;
String InterfaceClassGuid, ;
Integer MemberIndex, ;
String @DeviceInterfaceData
Declare Integer SetupDiDestroyDeviceInfoList In "setupapi.dll" ;
Integer DeviceInfoSet
Declare Integer SetupDiGetDeviceInterfaceDetail In "setupapi.dll" ;
Integer DeviceInfoSet, ;
String DeviceInterfaceData, ;
String @DeviceInterfaceDetailData, ;
Integer DeviceInterfaceDetailDataSize, ;
Integer @RequiredSize, ;
String @DeviceInfoData
Declare INTEGER CreateFile IN kernel32;
STRING lpFileName,INTEGER dwDesiredAccess,INTEGER dwShareMode,;
INTEGER lpSecurityAttr,INTEGER dwCreationDisp,INTEGER dwFlagsAndAttrs,;
INTEGER hTemplateFile
DECLARE INTEGER CloseHandle IN kernel32 INTEGER hObject
DECLARE INTEGER DeviceIoControl IN kernel32;
INTEGER hDevice,;
INTEGER dwIoControlCode,;
STRING @ lpInBuffer,;
INTEGER nInBufferSize,;
STRING @ lpOutBuffer,;
INTEGER nOutBufferSize,;
INTEGER @ lpBytesReturned,;
INTEGER lpOverlapped

DiskGUID = guid(GUID_DEVINTERFACE_USB_DEVICE)
hSetup = SetupDiGetClassDevs(DiskGUID, 0, 0, Bitor(DIGCF_PRESENT, DIGCF_DEVICEINTERFACE))
If hSetup <> INVALID_HANDLE_VALUE
i = 0
Success=1
Do While Success<>0
dia = dword2str(28)+Replicate(Chr(0),16)+Replicate(Chr(0),4)+Replicate(Chr(0),4)
Success = SetupDiEnumDeviceInterfaces(hSetup, 0, DiskGUID, i, @dia)
If Success <> 0
da = dword2str(28)+Replicate(Chr(0),16)+Replicate(Chr(0),4)+Replicate(Chr(0),4)
didd = dword2str(5)+Replicate(Chr(0),BUFFER_SIZE)
nBytes = BUFFER_SIZE
nRequiredSize = 0
m.err1 = SetupDiGetDeviceInterfaceDetail(hSetup, dia, @didd, nBytes, @nRequiredSize, @da)
didd="\\.\"+SUBSTR(didd,9)
didd=LEFT(didd,AT(CHR(0),didd)-1)
?didd
hcom=CreateFile(didd, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
IF hcom <>INVALID_HANDLE_VALUE
* =DeviceIoControl(hcom,....) &&不会写了
**就在这里,可我不会,后面是网上找到的一段话:我现在就是在做USB开发,我大致跟你说下思路。
**得到VID,PID等等,此类字符,很小的字节,可以先用扫描的方法,得到它的句柄,然后用DeviceIoControl发送PUSB_NODE_CONNECTION_INFORMATION_EX命令,
**数据会保存在这个结构里面PUSB_NODE_CONNECTION_INFORMATION_EX。需要用到Windows DDK的一些头文件.其他比如厂商名,产品名的,这些比较长的字符串,
**发送上面的命令后,会产生一个Index,这些需要发送IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION命令来得到,注意接受的结构必须是PUSB_DESCRIPTOR_REQUEST。然后自己用指针读出来。
**把下面的转换插入就可以了
text noshow
if(! DeviceIoControl(hub, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, str_req, 513, str_req, 513, &data_len, 0))

{

LanIDs_num = 0;

LanIDs = 0;

}

else

{

LanIDs_num = (str_desc->bLength - 2) / 2;

LanIDs = str_desc->bString;

}



//读语言

BYTE tmp_buf2[513] = {0};

str_req = (USB_DESCRIPTOR_REQUEST*)tmp_buf2;

str_desc = (USB_STRING_DESCRIPTOR*)(tmp_buf2 + sizeof(USB_DESCRIPTOR_REQUEST) - 1);



//输出

MyPrintf("Device Descriptor:");

MyPrintf("bcdUSB: 0x%04X", dev_desc->bcdUSB);

MyPrintf("bDeviceClass: 0x%02X", dev_desc->bDeviceClass);

MyPrintf("bDeviceSubClass: 0x%02X", dev_desc->bDeviceSubClass);

MyPrintf("bDeviceProtocol: 0x%02X", dev_desc->bDeviceProtocol);

MyPrintf("bMaxPacketSize0: 0x%02X (%d)", dev_desc->bMaxPacketSize0, dev_desc->bMaxPacketSize0);

MyPrintf("idVendor: 0x%04X", dev_desc->idVendor);

MyPrintf("idProduct: 0x%04X", dev_desc->idProduct);

MyPrintf("bcdDevice: 0x%04X", dev_desc->bcdDevice);

MyPrintf("iManufacturer: 0x%02X", dev_desc->iManufacturer);

endtext

=CloseHandle(hcom)
endif
Endif
i = i+1
Enddo
Endif
SetupDiDestroyDeviceInfoList(hSetup)
Return

Function Guid
Lparameter m.guid
m.guid=Chrtran(m.guid,"{}-","")
Return ;
word2str(Eval("0x"+Substr(m.guid,5,4)))+ ;
word2str(Eval("0x"+Substr(m.guid,1,4)))+ ;
word2str(Eval("0x"+Substr(m.guid,9,4)))+ ;
word2str(Eval("0x"+Substr(m.guid,13,4)))+ ;
chr(Eval("0x"+Substr(m.guid,17,2)))+ ;
chr(Eval("0x"+Substr(m.guid,19,2)))+ ;
chr(Eval("0x"+Substr(m.guid,21,2)))+ ;
chr(Eval("0x"+Substr(m.guid,23,2)))+ ;
chr(Eval("0x"+Substr(m.guid,25,2)))+ ;
chr(Eval("0x"+Substr(m.guid,27,2)))+ ;
chr(Eval("0x"+Substr(m.guid,29,2)))+ ;
chr(Eval("0x"+Substr(m.guid,31,2)))


Function dword2str
Lparameter m.wrd
Local m.wrd1, m.st1
m.wrd1=m.wrd%4294967296
Declare RtlMoveMemory In Win32API String @st1, Integer @wrd, Integer Cnt
m.st1=Chr(0)+Chr(0)+Chr(0)+Chr(0)
RtlMoveMemory(@m.st1, @m.wrd, 4)
Return m.st1

Function word2str
Lparameter m.wrd
Local m.wrd1, m.st1
m.wrd1=m.wrd%65536
Declare RtlMoveMemory In Win32API String @st1, Integer @wrd, Integer Cnt
m.st1=Chr(0)+Chr(0)
RtlMoveMemory(@m.st1, @m.wrd, 2)
Return m.st1
...全文
1114 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldbbb 2014-12-01
  • 打赏
  • 举报
回复
FUNCTION GetHUBPort(hHUB, dbPortIndex)
    LOCAL szBuffer, dwReturnedSize, ddConnectionIndex
    LOCAL iManufacturer, iProduct, iSerialNumber, idVendor, idProduct, bcdDevice
    LOCAL DeviceIsHub, ConnectionStatus

        * USB_NODE_CONNECTION_INFORMATION 结构
        * 端口号,szBuffer->ConnectionIndex = dbPortIndex
    szBuffer       = BINTOC(dbPortIndex, "4RS") + REPLICATE(0h00, BUFFER_SIZE - 4)
    dwReturnedSize = 0
                        
    IF DeviceIoControl(hHUB,;
                       IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,;
                       @szBuffer, BUFFER_SIZE,;
                       @szBuffer, BUFFER_SIZE,;
                       @dwReturnedSize,;
                       0) != 0
                       
        ddConnectionIndex = CTOBIN(LEFT(szBuffer, 4), "4RS")
                            
        IF ddConnectionIndex > 0
                * 集线器标志,szBuffer->DeviceIsHub
            DeviceIsHub = CTOBIN(SUBSTR(szBuffer, 25, 1), "1RS")
        
            IF DeviceIsHub == 1    && 是集线器
                szBuffer       = BINTOC(dbPortIndex, "4RS") + REPLICATE(0h00, BUFFER_SIZE - 4)
                dwReturnedSize = 0

                IF DeviceIoControl(hHUB,;
                                   IOCTL_USB_GET_NODE_CONNECTION_NAME,;
                                   @szBuffer, BUFFER_SIZE,;
                                   @szBuffer, BUFFER_SIZE,;
                                   @dwReturnedSize,;
                                   0) != 0
                                   
                        * 取集线器名
                    szBuffer = RTRIM(STRCONV(SUBSTR(szBuffer, 9, dwReturnedSize - 8), 6), 0h00, " ")
                    GetHUB(szBuffer)    && 遍历集线器
                ENDIF
            ELSE
                    * 连接状态,szBuffer->ConnectionStatus
                ConnectionStatus = CTOBIN(SUBSTR(szBuffer, 31, 4), "4RS")

                IF ConnectionStatus > 0
                        * USB_NODE_CONNECTION_INFORMATION 结构
                    idVendor  = CTOBIN(SUBSTR(szBuffer, 13, 2) + 0h0000, "4RS")
                    idProduct = CTOBIN(SUBSTR(szBuffer, 15, 2) + 0h0000, "4RS")
                    bcdDevice = CTOBIN(SUBSTR(szBuffer, 17, 2) + 0h0000, "4RS")
                
                    INSERT INTO dt VALUES ("供应商ID", IIF(idVendor  > 0, TRANSFORM(idVendor), "NULL"))
                    INSERT INTO dt VALUES ("  产品ID", IIF(idProduct > 0, TRANSFORM(idProduct), "NULL"))
                    INSERT INTO dt VALUES ("设备编码", IIF(bcdDevice > 0, TRANSFORM(bcdDevice), "NULL"))
                                
                        * iManufacturer、iProduct 和 iSerialNumber 域指向一个串描述符,
                        * 该串描述符用人类可读的语言描述设备生产厂商、产品和序列号。
                    iManufacturer = CTOBIN(SUBSTR(szBuffer, 19, 1), "1RS")
                    iProduct      = CTOBIN(SUBSTR(szBuffer, 20, 1), "1RS")
                    iSerialNumber = CTOBIN(SUBSTR(szBuffer, 21, 1), "1RS")
                    INSERT INTO dt VALUES ("厂商描述", GetStringDescriptor(hHUB, ddConnectionIndex, iManufacturer))
                    INSERT INTO dt VALUES ("产品描述", GetStringDescriptor(hHUB, ddConnectionIndex, iProduct))
                    INSERT INTO dt VALUES ("  序列号", GetStringDescriptor(hHUB, ddConnectionIndex, iSerialNumber))
                    INSERT INTO dt VALUES ("", "")
                ENDIF
            ENDIF
        ENDIF
    ENDIF
ENDFUNC
        

FUNCTION GetHUBName(hHostController)
    LOCAL szBuffer, dwReturnedSize
    szBuffer       = REPLICATE(0h00, BUFFER_SIZE)
    dwReturnedSize = 0

    IF DeviceIoControl(hHostController,;
                       IOCTL_USB_GET_ROOT_HUB_NAME,;
                       @szBuffer, BUFFER_SIZE,;
                       @szBuffer, BUFFER_SIZE,;
                       @dwReturnedSize,;
                       0) != 0
        
        szBuffer = STRCONV(SUBSTR(szBuffer, 5, dwReturnedSize - 4), 6)
        RETURN RTRIM(szBuffer, 0h00, " ")
    ENDIF

    RETURN NULL
ENDFUNC


FUNCTION GetStringDescriptor(hHUB, dbConnectionIndex, dbDescriptorIndex)
    LOCAL szBuffer, dwReturnedSize, dbLength, dbDescriptorType
    
    IF (dbConnectionIndex < 1) OR (dbDescriptorIndex < 1)
        RETURN "NULL"
    ENDIF
        * sizeof(USB_DESCRIPTOR_REQUEST) = 12
        * szBuffer->ConnectionIndex     = ConnectionIndex
        * szBuffer->SetupPacket.wValue  = (USB_STRING_DESCRIPTOR_TYPE << 8) | DescriptorIndex
        * szBuffer->SetupPacket.wIndex  = GetSystemDefaultLangID()
        * szBuffer->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST))
    szBuffer = BINTOC(dbConnectionIndex, "4RS") + 0h0000;
             + BINTOC(BITOR(BITLSHIFT(USB_STRING_DESCRIPTOR_TYPE, 8), dbDescriptorIndex), "2RS");
             + BINTOC(0, "2RS");
             + BINTOC(BUFFER_SIZE - 12, "2RS") + REPLICATE(0h00, BUFFER_SIZE - 12)
             
    dwReturnedSize = 0

    IF DeviceIoControl(hHUB,;
                       IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,;
                       @szBuffer, BUFFER_SIZE,;
                       @szBuffer, BUFFER_SIZE,;
                       @dwReturnedSize,;
                       0) != 0
                       
            * USB_STRING_DESCRIPTOR 结构
        dbLength         = CTOBIN(SUBSTR(szBuffer, 13, 1), "1RS")
        dbDescriptorType = CTOBIN(SUBSTR(szBuffer, 14, 1), "1RS")
        
        IF (dwReturnedSize > 1) AND (dbLength == dwReturnedSize - 12);
                                AND (dbDescriptorType == USB_STRING_DESCRIPTOR_TYPE);
                                AND (dbLength % 2 == 0)
        
            RETURN RTRIM(STRCONV(SUBSTR(szBuffer, 15, dbLength), 6), 0h00, " ")
        ELSE
            RETURN "NULL"
        ENDIF
    ENDIF

    RETURN "NULL"
ENDFUNC
oldbbb 2014-12-01
  • 打赏
  • 举报
回复
FUNCTION CTL_CODE(DeviceType, Function, Method, Access)
    RETURN BITOR(BITLSHIFT(DeviceType, 16), BITLSHIFT(Access, 14), BITLSHIFT(Function, 2), Method)
ENDFUNC

FUNCTION EnumUsbDevice()
    LOCAL i, hHCD, szHCDPath, szHUBName
    
    FOR i = 0 TO 9            && 假定最多有10个主控
        szHCDPath = "\\.\HCD" + TRANSFORM(i)

        hHCD = CreateFile(@szHCDPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)
            
        IF hHCD == INVALID_HANDLE_VALUE
            EXIT
        ENDIF
        
        szHUBName = GetHUBName(hHCD)
            
        IF !ISNULL(szHUBName)
            GetHUB(szHUBName)    && 取集线器数据
        ENDIF

        CloseHandle(hHCD)
    ENDFOR
ENDFUNC
            

FUNCTION GetHUB(szHUBName)
    LOCAL i, hHUB, szHUBPath, szBuffer, dwReturnedSize, dbPorts
    
    szHUBPath = "\\.\" + szHUBName
    hHUB      = CreateFile(@szHUBPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0)
                
    IF hHUB != INVALID_HANDLE_VALUE
        szBuffer       = REPLICATE(0h00, BUFFER_SIZE)
        dwReturnedSize = 0

        IF DeviceIoControl(hHUB,;
                           IOCTL_USB_GET_NODE_INFORMATION,;
                           @szBuffer, BUFFER_SIZE,;
                           @szBuffer, BUFFER_SIZE,;
                           @dwReturnedSize,;
                           0) != 0
                           
                * USB_NODE_INFORMATION 结构
                * 端口数,dbPports = szBuffer->u.HubInformation.HubDescriptor.bNumberOfPorts
            dbPorts = CTOBIN(SUBSTR(szBuffer, 7, 1), "1RS")
            
            FOR i = 1 TO dbPorts
                GetHUBPort(hHUB, i)    && 取各端口数据
            ENDFOR
        ENDIF
                            
        CloseHandle(hHUB)
    ENDIF
ENDFUNC
oldbbb 2014-12-01
  • 打赏
  • 举报
回复
也可从主控(HCD)枚举 USB 设备
*
* 枚举USB设备
*
CLEAR

#DEFINE GENERIC_WRITE       0x40000000
#DEFINE FILE_SHARE_WRITE    0x00000002
#DEFINE OPEN_EXISTING       3

#DEFINE INVALID_HANDLE_VALUE    -1
#DEFINE BUFFER_SIZE             2048

#DEFINE FILE_DEVICE_USB                            0x00000022 
#DEFINE HCD_GET_ROOT_HUB_NAME                      258
#DEFINE USB_GET_NODE_INFORMATION                   258
#DEFINE USB_GET_NODE_CONNECTION_INFORMATION        259
#DEFINE USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION    260
#DEFINE USB_GET_NODE_CONNECTION_NAME               261
#DEFINE METHOD_BUFFERED                            0
#DEFINE FILE_ANY_ACCESS                            0

#DEFINE IOCTL_USB_GET_ROOT_HUB_NAME                      CTL_CODE(FILE_DEVICE_USB,;
                                                                  HCD_GET_ROOT_HUB_NAME,;
                                                                  METHOD_BUFFERED,;
                                                                  FILE_ANY_ACCESS)

#DEFINE IOCTL_USB_GET_NODE_INFORMATION                   CTL_CODE(FILE_DEVICE_USB,;
                                                                  USB_GET_NODE_INFORMATION,;
                                                                  METHOD_BUFFERED,;
                                                                  FILE_ANY_ACCESS)

#DEFINE IOCTL_USB_GET_NODE_CONNECTION_INFORMATION        CTL_CODE(FILE_DEVICE_USB,;
                                                                  USB_GET_NODE_CONNECTION_INFORMATION,;
                                                                  METHOD_BUFFERED,;
                                                                  FILE_ANY_ACCESS)

#DEFINE IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION    CTL_CODE(FILE_DEVICE_USB,;
                                                                  USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,;
                                                                  METHOD_BUFFERED,;
                                                                  FILE_ANY_ACCESS)

#DEFINE IOCTL_USB_GET_NODE_CONNECTION_NAME               CTL_CODE(FILE_DEVICE_USB,;
                                                                  USB_GET_NODE_CONNECTION_NAME,;
                                                                  METHOD_BUFFERED,;
                                                                  FILE_ANY_ACCESS)

#DEFINE USB_STRING_DESCRIPTOR_TYPE    0x03

DECLARE LONG CreateFile                       IN Kernel32 STRING@, LONG, LONG, STRING@, LONG, LONG, LONG
DECLARE LONG CloseHandle                      IN Kernel32 LONG
DECLARE LONG DeviceIoControl                  IN Kernel32 LONG, LONG, STRING@, LONG, STRING@, LONG, LONG@, LONG
DECLARE LONG GetSystemDefaultLangID           IN Kernel32

CREATE CURSOR dt (Property C(10), Value C(50))

EnumUsbDevice()
GO TOP 
BROWSE

CLEAR DLLS
RETURN
sych11 2014-12-01
  • 打赏
  • 举报
回复
分不多,谢谢您的爱心!
sych11 2014-12-01
  • 打赏
  • 举报
回复
,谢谢!太好了
old_bb 2014-12-01
  • 打赏
  • 举报
回复
发现上面代码有误(坛子有限制换临时身份,请谅解)
更正:
GetHUBPort()函数中:
ConnectionStatus = CTOBIN(SUBSTR(szBuffer, 31, 4), "4RS")
IF ConnectionStatus > 0*
改为:
ConnectionStatus = CTOBIN(SUBSTR(szBuffer, 32, 1), "1RS")
IF ConnectionStatus == 1

回马枪 2014-11-28
  • 打赏
  • 举报
回复
部分属性不能正常读出来 或取出的是错的 都正常 比如 U 盘的容量可以增容 序列号可以改写 主控生产商的VID可以随便向产品写入VID和PID 有些厂家被收购或合并了,ID 可能有多个 其实只要找到主控的PID 然后到 USB 官网找到实际的对应的 U 盘信息:http://www.linux-usb.org/usb.ids 最简单的获取 U 盘的 VID、PID 的 DOS P 命令:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=8 delims=_\" %%i in ('REG QUERY HKLM\system\CurrentControlSet\Control\usbstor') do (
    set var=%%i
    echo 设备标识码:%%i   VID=!var:~0,4!   PID=!var:~-4!
)
pause
sych11 2014-11-27
  • 打赏
  • 举报
回复
只是上面这样获取到设备信息后不能对设备做进一步的控制、操作,比如读写等
sych11 2014-11-27
  • 打赏
  • 举报
回复
谢谢,除了一个属性出错外,其他都可以正常读出来
回马枪 2014-11-27
  • 打赏
  • 举报
回复
给你一个全一点的可以读取 U 盘全部信息的代码 很多信息不一定可以读得出

Local strComputer, objWMIService, colItems, objItem
Clear
strComputer = "."
objWMIService = Getobject("winmgmts:\\" + strComputer + "\root\cimv2")
colItems = objWMIService.ExecQuery("Select * from win32_diskdrive",,48)
For Each objItem In colItems
    If Left(Lower(objItem.mediatype),9)  = Lower("Removable")
        *!* Win32_DiskDrive 对象的属性名如下:
        ? "Caption : ", objItem.Caption 
        ? "CompressionMethod : ", objItem.CompressionMethod 
        ? "ConfigManagerErrorCode : ", objItem.ConfigManagerErrorCode 
        ? "ConfigManagerUserConfig : ", objItem.ConfigManagerUserConfig 
        ? "CreationClassName : ", objItem.CreationClassName 
        ? "DefaultBlockSize : ", objItem.DefaultBlockSize 
        ? "Description : ", objItem.Description 
        ? "DeviceID : ", objItem.DeviceID 
        ? "ErrorCleared : ", objItem.ErrorCleared 
        ? "ErrorDescription : ", objItem.ErrorDescription 
        ? "ErrorMethodology : ", objItem.ErrorMethodology 
        ? "FirmwareRevision : ", objItem.FirmwareRevision 
        ? "Index : ", objItem.Index 
        ? "InstallDate : ", objItem.InstallDate 
        ? "InterfaceType : ", objItem.InterfaceType 
        ? "LastErrorCode : ", objItem.LastErrorCode 
        ? "Manufacturer : ", objItem.Manufacturer 
        ? "MaxBlockSize : ", objItem.MaxBlockSize 
        ? "MaxMediaSize : ", objItem.MaxMediaSize 
        ? "MediaLoaded : ", objItem.MediaLoaded 
        ? "MediaType : ", objItem.MediaType 
        ? "MinBlockSize : ", objItem.MinBlockSize 
        ? "Model : ", objItem.Model 
        ? "Name : ", objItem.Name 
        ? "NeedsCleaning : ", objItem.NeedsCleaning 
        ? "NumberOfMediaSupported : ", objItem.NumberOfMediaSupported 
        ? "Partitions : ", objItem.Partitions 
        ? "序列号 : ", StrExtract(objItem.PNPDeviceID, "\", "&", 2)
        ? "PowerManagementCapabilities[] : ", objItem.PowerManagementCapabilities[]
        ? "PowerManagementSupported : ", objItem.PowerManagementSupported 
        ? "SCSIBus : ", objItem.SCSIBus 
        ? "SCSILogicalUnit : ", objItem.SCSILogicalUnit 
        ? "SCSIPort : ", objItem.SCSIPort 
        ? "SCSITargetId : ", objItem.SCSITargetId 
        ? "SectorsPerTrack : ", objItem.SectorsPerTrack 
        ? "SerialNumber : ", objItem.SerialNumber 
        ? "Signature : ", objItem.Signature 
        ? "容量 : ", objItem.Size 
        ? "状态 : ", objItem.Status 
        ? "状态信息 : ", objItem.StatusInfo 
        ? "SystemCreationClassName : ", objItem.SystemCreationClassName 
        ? "SystemName : ", objItem.SystemName 
        ? "TotalCylinders : ", objItem.TotalCylinders 
        ? "TotalHeads : ", objItem.TotalHeads 
        ? "TotalSectors : ", objItem.TotalSectors 
        ? "TotalTracks : ", objItem.TotalTracks 
        ? "TracksPerCylinder : ", objItem.TracksPerCylinder 
    Endif
Next

Return
回马枪 2014-11-27
  • 打赏
  • 举报
回复
对什么设备不能做进一步的控制、操作,比如读写??? 是 U 盘设备吗 上面的代码 84 可以读取:供应商、系列号等信息的吗? 写数据到 U 盘可以用:copy MyFile.txt to H: 如果要更改 U 盘上的型号、系列号或供应商的信息 好像不行
sych11 2014-11-26
  • 打赏
  • 举报
回复
谢谢都市夜猫
都市夜猫 2014-11-26
  • 打赏
  • 举报
回复
若是 xp 以上 Windows,简单点可以用 wmi 来查询 usb 设备信息,只是速度可能会慢点 用 wmi + 查询 + usb + 设备信息 问问度娘
sych11 2014-11-26
  • 打赏
  • 举报
回复
谢谢,希望原来做过的或者看懂原帖的帮忙转一下,比如插入U盘,可以查到U盘的制造商、金士顿、闪迪等,插入相机可以查到相机的制造商佳能、尼康、索尼等
oldbbb 2014-11-26
  • 打赏
  • 举报
回复
只是查询,CreateFile()可以这样,以防对独占设备访问产生异常。 hcom=CreateFile(didd, 0,0, 0, OPEN_EXISTING, 0, 0)
sych11 2014-11-26
  • 打赏
  • 举报
回复
太棒了,谢谢!
回马枪 2014-11-26
  • 打赏
  • 举报
回复

Clear

Local strComputer, objWMIService, colItems, objItem
Clear
strComputer = "."
objWMIService = Getobject("winmgmts:\\" + strComputer + "\root\cimv2")
colItems = objWMIService.ExecQuery("Select * from win32_diskdrive",,48)
For Each objItem In colItems
    If Left(Lower(objItem.mediatype),9)  = Lower("Removable")
        ? "PNPDeviceID : " + objItem.PNPDeviceID    &&This is Mostly Like Unique
        ? "SIZE : " + objItem.Size   &&This is also Mostly Like Unique
        ? "TotalSectors : " + objItem.TotalSectors   &&This is also Mostly Like Unique
        ? "Model : " + objItem.model
    Endif

Next

Return

回马枪 2014-11-26
  • 打赏
  • 举报
回复

Clear
lcComputer = "."
loWMIService = Getobject("winmgmts:" + "{impersonationLevel=impersonate}!\\" + lcComputer + "\root\cimv2")
loUSBDisks = loWMIService.ExecQuery("Select * from Win32_DiskDrive where interfaceType='USB'")
? "你的 USB 优盘信息: "
? "================== "
? "个  数: "
?? Transform(loUSBDisks.Count)

For Each loDisk In loUSBDisks
    lcPNPDeviceID=loDisk.PNPDeviceID
    lcPNPDeviceID=Strtran(lcPNPDeviceID,[USBSTOR\],[])
    ? "供应商: "
    lnStart=At("&",lcPNPDeviceID, 2) + 1
    lnEnd=At("&",lcPNPDeviceID, 3)
    ?? Substr(lcPNPDeviceID, lnStart, lnEnd - lnStart)
    ? "版本号: "
    lnStart=At("&", lcPNPDeviceID, 3) + 1
    lnEnd=At("\", lcPNPDeviceID, 1)
    ?? Substr(lcPNPDeviceID, lnStart, lnEnd - lnStart)
    ? "系列号: "
    lnStart=At("\", lcPNPDeviceID, 1) + 1
    lnEnd=At("&", lcPNPDeviceID, 4)
    ?? Substr(lcPNPDeviceID, lnStart, lnEnd - lnStart)
Next

sych11 2014-11-25
  • 打赏
  • 举报
回复
上述代码可以直接运行

2,726

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧