永发信息网

如何用delphi获取U盘ID

答案:2  悬赏:0  手机版
解决时间 2021-03-16 05:29
如何用delphi获取U盘ID
最佳答案
有USB的单元,调用一下里面的方法就行,但好像只能在XP电脑上获取
全部回答
unit unit1; interface uses   windows, messages, sysutils, variants, classes, graphics, controls, forms,   dialogs, stdctrls,registry; type   tform1 = class(tform)     label1: tlabel;     procedure formcreate(sender: tobject);   private     { private declarations }   public     { public declarations }     procedure checkdevice(var msg:tmessage); message wm_devicechange;   end; var   form1: tform1;   flag:boolean; const   digcf_present = $00000002;   digcf_deviceinterface = $00000010;   anysize_array = 1;   setupapi = 'setupapi.dll'; type   hdevinfo = pointer;   ulong_ptr = dword;   pspdevinfodata = ^tspdevinfodata;   sp_devinfo_data = packed record     cbsize: dword;     classguid: tguid;     devinst: dword;     reserved: ulong_ptr;   end; {$externalsym sp_devinfo_data}   tspdevinfodata = sp_devinfo_data;   pspdeviceinterfacedata = ^tspdeviceinterfacedata;   sp_device_interface_data = packed record     cbsize: dword;     interfaceclassguid: tguid;     flags: dword;     reserved: ulong_ptr;   end; {$externalsym sp_device_interface_data}   tspdeviceinterfacedata = sp_device_interface_data;   pspdeviceinterfacedetaildataa = ^tspdeviceinterfacedetaildataa;   sp_device_interface_detail_data_a = packed record     cbsize: dword;     devicepath: array[0..anysize_array - 1] of ansichar;   end; {$externalsym sp_device_interface_detail_data_a}   tspdeviceinterfacedetaildataa = sp_device_interface_detail_data_a; implementation {$r *.dfm}   function setupdigetclassdevsa(classguid: pguid; const enumerator: pansichar;   hwndparent: hwnd; flags: dword): hdevinfo; stdcall; external setupapi; function setupdienumdeviceinterfaces(deviceinfoset: hdevinfo;   deviceinfodata: pspdevinfodata; const interfaceclassguid: tguid;   memberindex: dword; var deviceinterfacedata: tspdeviceinterfacedata): bool; stdcall; external setupapi; {$externalsym setupdienumdeviceinterfaces} function setupdigetdeviceinterfacedetaila(deviceinfoset: hdevinfo;   deviceinterfacedata: pspdeviceinterfacedata;   deviceinterfacedetaildata: pspdeviceinterfacedetaildataa;   deviceinterfacedetaildatasize: dword; var requiredsize: dword;   device: pspdevinfodata): bool; stdcall; external setupapi; function setupdidestroydeviceinfolist(deviceinfoset: hdevinfo): bool; stdcall; external setupapi; function getusbdiskid(const diskid: string; var pid: string): boolean; var   usbguid: tguid;   usbhandle: hdevinfo;   success: longbool;   devn: integer;   devdata: tspdevinfodata;   deviceinterfacedata: tspdeviceinterfacedata;   functionclassdevicedata: pspdeviceinterfacedetaildataa;   bytesreturned: dword;   reg: tregistry;   regdata: array of char;   i, regsize: integer;   str, usbpath: string; begin   result := false;   pid := '';   reg := tregistry.create;   try     reg.rootkey := hkey_local_machine;     reg.openkey('system\mounteddevices', false);     regsize := reg.getdatasize(format('\dosdevices\%s', [diskid]));     setlength(regdata, regsize + 1);     reg.readbinarydata(format('\dosdevices\%s', [diskid]), regdata[0], regsize + 1);     for i := 0 to regsize - 1 do if regdata[i] <> #0 then str := str + regdata[i];     str := copy(str, pos('#removablemedia#', str) + 16, length(str));     str := copy(str, 1, pos('rm', str) - 2);     str := uppercase(str);     reg.closekey;     usbguid := stringtoguid('{53f56307-b6bf-11d0-94f2-00a0c91efb8b}');     usbhandle := setupdigetclassdevsa(@usbguid, nil, 0, digcf_present or digcf_deviceinterface);     if usbhandle = pointer(invalid_handle_value) then exit;     devn := 0;     repeat     deviceinterfacedata.cbsize := sizeof(tspdeviceinterfacedata);     success := setupdienumdeviceinterfaces(usbhandle, nil, usbguid, devn, deviceinterfacedata);     if success then begin devdata.cbsize := sizeof(devdata); bytesreturned := 0;     setupdigetdeviceinterfacedetaila(usbhandle, @deviceinterfacedata, nil, 0, bytesreturned, @devdata);     if (bytesreturned <> 0) and (getlasterror = error_insufficient_buffer) then begin functionclassdevicedata := allocmem(bytesreturned);     functionclassdevicedata^.cbsize := sizeof(tspdeviceinterfacedetaildataa);     if setupdigetdeviceinterfacedetaila(usbhandle, @deviceinterfacedata, functionclassdevicedata, bytesreturned, bytesreturned, @devdata) then begin     usbpath := strpas(pchar(@functionclassdevicedata.devicepath));     if reg.openkeyreadonly(format('system\currentcontrolset\enum%s', [stringreplace(copy(usbpath, 4, pos('{', usbpath) - 5), '#', '\', [rfreplaceall])])) then     if uppercase(reg.readstring('parentidprefix')) = str then begin delete(usbpath, 1, pos('#', usbpath));     pid := copy(usbpath, pos('#', usbpath) + 1, length(usbpath));     pid := copy(pid, 1, pos('#{', pid) - 1);     pid := uppercase(stringreplace(pid, '&', '', [rfreplaceall]));     result := true; break; end; reg.closekey; inc(devn); end;     freemem(functionclassdevicedata); end; end;     until not success;     setupdidestroydeviceinfolist(usbhandle);     finally reg.free; end; end; procedure tform1.checkdevice(var msg: tmessage); const   dbt_devicearrival = $8000;   dbt_deviceremovecomplete = $8004;   dbt_devnodes_changed = $0007; var i,j:longint;   ssss,idd:string; begin   if flag then exit;   case msg.wparam of     dbt_devicearrival:begin       for i:=1 to 26 do begin         if directoryexists(chr(64+i)+':\') and (getdrivetype(pchar(chr(64+i)+':\')) = drive_removable)         then begin             showmessage('');         end;       end;     end;//增加了新硬件     dbt_deviceremovecomplete:begin   showmessage('') ;//移除硬件 end;     dbt_devnodes_changed:     begin         showmessage('');     end;   end; end; end.以上代码在增加硬件时检测有多少个盘符,将新增的记录下来,移除硬件时将记录删去就好了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
什么时候皇帝开始有庙号?
辽国是现在的哪座城市
几个人(3-5个)在一起有什么游戏玩啊?(我
逸仙居酒楼在哪里啊,我有事要去这个地方
系统升级后文件丢失或损坏怎么解决
蒙多符文带两个法术吸血可以吗
dz15le-40/2901天正两相漏电断路器多少钱
如图所示,一斜面体静止在粗糙的水平地面上,
楼房下水管道检查口计算规则
红星五组团(东门)怎么去啊,有知道地址的么
做我老婆好不好恶搞歌词
靖远县北湾镇古城村卫生室这个地址在什么地方
N46机械油中的N是什么意思
“哦!我亲爱的上帝拜托你快来救救我吧!”请
建筑劳务公司员工辞职后的社保怎么转到别的员
推荐资讯
范长伟灸草堂地址在什么地方,想过去办事
赵云家电地址有知道的么?有点事想过去
天津到晋城的大巴几点发车呢?
三星的翻盖手机,怎样设置就能让来电翻盖不直
现在最值钱的木材是什么
电梯抱闸检测触点故障怎么处理
破水后多久阵痛
什么软件可以有效查杀病毒
冷车难起动 起动时来回踩油门 打着火了 松开
北京哪个摄影学校比较好?
爱玛电动车tdr833z-2多少钱
13岁眼睛弱视能治好吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?