获取U盘序列号的代码

获取U盘序列号的代码 日期:2007年10月29日 作者:laihongbo 人气:4679 查看:[大字体 中字体 小字体] 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(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.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 ShowMessage(Pid); end;

转载于:https://my.oschina.net/u/582827/blog/729811

获取U盘ID序列号 VS2005编译通过,源码源自CSDN。已经测试好用。 可以获得U盘名称,制造商ID号 版本号 U盘序列号及容量 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Management; namespace UDiskTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { DriveInfo[] s = DriveInfo.GetDrives(); foreach (DriveInfo drive in s) { if (drive.DriveType == DriveType.Removable) { pf.Text = drive.Name.ToString(); break; } } ManagementClass cimobject = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = cimobject.GetInstances(); foreach (ManagementObject mo in moc) { if (mo.Properties["InterfaceType"].Value.ToString() == "USB") { try { //产品名称 Caption.Text = mo.Properties["Caption"].Value.ToString(); //总容量 Size.Text = mo.Properties["Size"].Value.ToString(); string[] info = mo.Properties["PNPDeviceID"].Value.ToString().Split('&'); string[] xx = info[3].Split('\\'); //序列号 MessageBox.Show("U盘序列号:" + xx[1]); PNPDeviceID.Text = xx[1]; xx = xx[0].Split('_'); //版本号 REV.Text = xx[1]; //制造商ID xx = info[1].Split('_'); VID.Text = xx[1]; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } } } 如果编译遇到问题是using System.Management;无法找到引用找到, 项目(p)->添加引用(R)->找到.NET标签页 列表中下部位找到System.Management 双击点确定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值