从驱动器号获取制造商,序列号,型号

时间:2013-11-04 08:32:56

标签: delphi usb wmi

我正在尝试使用其驱动器号获得一些有效的代码来获取USB驱动器的供应商,序列号和型号。我经常搜索并找到了几个解决方案。但我无法确定哪一个是最好的。

第一个是here。使用来自JEDI的hid.pas,但我不知道如何在单个驱动器中使用它。特别地,函数GetHidDeviceInfo非常有趣,但需要符号链接而不是驱动器号。我试图邀请驱动器号的符号链接无济于事。

第二个是here。使用看起来不太干净的WMI。我的经验告诉我,WMI并不适用于所有PC。该代码在我自己的笔记本电脑上不起作用,说“RPC服务器不可用”。

请告诉我实现目标的最佳方法。还有其他方法吗?

更新:我发布了一些示例代码,结合了以下评论的结果。

{$APPTYPE CONSOLE}

uses
  Windows, Messages, SysUtils, Variants;

type
  PHIDDAttributes = ^THIDDAttributes;
  HIDD_ATTRIBUTES = record
    Size:          ULONG; // size of structure (set before call)
    VendorID:      Word;
    ProductID:     Word;
    VersionNumber: Word;
    //
    // Additional fields will be added to the end of this structure.
    //
  end;
  THIDDAttributes = HIDD_ATTRIBUTES;

  THIDUSBDeviceInfo = Record   { contains interface level information of each device}
    SymLink            : String;
    BufferSize         : Word;
    Handle             : THandle;
    VID                : DWord;
    PID                : DWord;
    VersionNumber      : Word;
    ManufacturerString : String;
    ProductString      : String;
    SerialNumberString : String;
end;

function GetVolumeNameForVolumeMountPointW(const lpszVolumeMountPoint: LPCWSTR;
  lpszVolumeName: LPWSTR; cchBufferLength: DWORD): BOOL; stdcall;
  external kernel32;

function HidD_GetAttributes(HidDeviceObject: THandle;
  var HidAttrs: THIDDAttributes): LongBool; stdcall;external 'hid.dll' name 'HidD_GetAttributes';
function HidD_GetManufacturerString(HidDeviceObject: THandle;
  Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;external 'hid.dll' name 'HidD_GetManufacturerString';
function HidD_GetProductString(HidDeviceObject: THandle;
  Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;external 'hid.dll' name 'HidD_GetProductString';
function HidD_GetSerialNumberString(HidDeviceObject: THandle;
  Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;external 'hid.dll' name 'HidD_GetSerialNumberString';

function GetVolumeName(Name: string): string;
var
  Volume: array [0..MAX_PATH] of Char;
begin
  FillChar(Volume[0], SizeOf(Volume), 0);
  GetVolumeNameForVolumeMountPointW(PChar(Name), @Volume[0], SizeOf(Volume));
  Result := Volume;
end;

Function GetHidDeviceInfo( Symlink : PChar) : THIDUSBDeviceInfo;
  Var
    pstr          : pWideChar;
    DevHandle    : THandle;
    HidAttrs     : THIDDAttributes;
  Begin
    FillChar(Result, SizeOf( Result), 0);
    Result.SymLink := SymLink+ #0;
    GetMem( pstr, 512);
    DevHandle := CreateFile( Symlink,
                             GENERIC_READ or GENERIC_WRITE,
                             FILE_SHARE_READ or FILE_SHARE_WRITE,
                             nil,
                             OPEN_EXISTING,
                             0,
                             0);
    If DevHandle <> INVALID_HANDLE_VALUE then
    begin
      If HidD_GetAttributes( DevHandle,HidAttrs) then
      begin
        result.VID           := HidAttrs.VendorID;
        result.PID           := HidAttrs.ProductID;
        result.VersionNumber := HidAttrs.VersionNumber;
      end;

      If HidD_GetManufacturerString( DevHandle, pstr, 512) then
        Result.ManufacturerString := pStr;

      If HidD_GetProductString( DevHandle, pstr, 512) then
        Result.ProductString := pStr;

      If HidD_GetSerialNumberString( DevHandle, pstr, 512) then
        Result.SerialNumberString := pStr;

      closeHandle( DevHandle);
    end;
    FreeMem( pStr);
  End;

procedure Main;
var
  VolumeName: string;
  info: THIDUSBDeviceInfo;
begin
  VolumeName:=GetVolumeName('i:\'); //assuming that I: is a USB drive
  info:=GetHidDeviceInfo(pchar(VolumeName));
  Writeln(info.SerialNumberString);
end;

begin
  Main;
  Readln;
end.

1 个答案:

答案 0 :(得分:0)

您可以尝试使用WMI获取SerialNumber of disk(和更多信息)。

使用WMI和Win32_DiskDrive class,您可以获得序列号。文档说:&#34; Windows Server 2003和Windows XP:此属性不可用。&#34;

在Windows Vista中,7/8工作正常。

要尝试此方法是否适合您,请尝试this simple demo on clubdelphi ftp(包括源代码和包含二进制文件)。在Windows 7中,您可以获得以下信息:

enter image description here

如果您可以获得正确的序列号,则可以使用WMI。

使用WMI is GLibWMI on Sourceforge工作的好图书馆。包含可与0代码行一起使用的特定组件(DiskDriveInfo)。 见演示。

enter image description here

此致