捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
获取优盘序列号的实现方法
关键字:GetUSBDiskID PID 优盘 U盘 序列号 注册表
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2007/6/7
发布者:laihongbo 发布时间:2007/6/7
编辑器:DELPHI7 语  种:简体中文
分 类:系统 下载浏览:0/26549
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
Uses Registry;

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;

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(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;
  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
          PID := StringReplace(Str, '&', '', [rfReplaceAll]);
          Result := True;
          Break;
          End;
          Reg.CloseKey;
          Inc(Devn);
        End;
        FreeMem(FunctionClassDeviceData);
      End;
    End;
  Until Not Success;
  SetupDiDestroyDeviceInfoList(USBHandle);
  Reg.Free;
End;

//使用方法
Procedure TForm1.Button1Click(Sender: TObject);
Var
  Drv, Pid: String;
Begin
  Drv := ExtractFileDrive(ParamStr(0));
  If GetDriveType(PChar(Drv + '\')) <> DRIVE_REMOVABLE Then
    Application.MessageBox('对不起,请把本程序放至到优盘上使用!', 'Error', MB_ICONHAND)
  Else
    If GetUSBDiskID(Drv, Pid) Then Memo1.Lines.Add(Pid);
End;
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论13条 当前显示最后6条评论
laihongbo 2007/6/11 18:52:20
我没有多的电脑,没法试,呵呵

文章我是参考别人写出来的,我也不保证准确
dunlee 2007/8/9 9:22:08
windows都没引用啊。
newsen 2007/8/12 13:21:31
编译通不过呀.老提示缺东西.
xlonger 2008/2/3 22:09:06
我的U盘的 ,根据代码取得的
USBPATH是

\\?\usbstor#disk&ven_generic&prod_flash_disk&rev_8.01#00000000&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

实际的VID是0ED1,PID是6687,我用微软的工具软件usbdeview.exe看的。
VID = 0ED1 表示厂家是爱国者

按照修正后的代码,返回值应该是00000000&0
实际的序列号是00000000

下面的文章好像和 laihongbo 楼主 取得的USBPATH 字符格式不同啊,里面根本没有VID ,PID。
http://blog.csdn.net/nicoc/archive/2007/01/18/1487042.aspx

pDetail->DevicePath 将是一串像
"\\?\usb#vid_0537&pid_a703#192b0c00048a#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"
的字符串,看到没有VID=0537,PID=A703,serial=192b0c00048a?

所以分离这串字符串就可以得到你想要的信息了.
ppaa 2008/2/10 19:55:49
在Vista操作系统测试时发现不能获取系列号,请指教
xlonger 2009/1/12 19:57:07
这个是错误的,大家不要用了。以免麻烦。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2012 V3.01 沪ICP备05001939号 更新RSS列表