Ver Mensaje Individual
  #10  
Antiguo 15-02-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
darkbits,

Cita:
Empezado por darkbits
...como sacar el ID unico del pendriver por mas que se llege a formatear...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FileCtrl, StrUtils, ActiveX, ComObj, XPMan;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function VarStrNull(const V:OleVariant):string; //avoid issues with null variants
begin
   Result:='';
   if not VarIsNull(V) then
      Result:=VarToStr(V);
end;

// Obtiene el Número de Serial un Drive USB por medio de la propiedad PnPDeviceID de Windows Management Instrumentation (WMI)
function GetUsbDriveSerial(const Drive : AnsiChar) : string;
var
   FSWbemLocator : OleVariant;
   objWMIService : OLEVariant;
   colDiskDrives : OLEVariant;
   colLogicalDisks : OLEVariant;
   colPartitions : OLEVariant;
   objDiskDrive : OLEVariant;
   objPartition : OLEVariant;
   objLogicalDisk : OLEVariant;
   oEnumDiskDrive : IEnumvariant;
   oEnumPartition : IEnumvariant;
   oEnumLogical : IEnumvariant;
   iValue : LongWord;
   DeviceID : string;

begin;

   Result:='';

   FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
   objWMIService := FSWbemLocator.ConnectServer('.', 'root\CIMV2', '', '');
   colDiskDrives := objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive WHERE InterfaceType="USB"','WQL',0);
   oEnumDiskDrive:= IUnknown(colDiskDrives._NewEnum) as IEnumVariant;

   while oEnumDiskDrive.Next(1, objDiskDrive, iValue) = 0 do
   begin

      //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
      DeviceID := StringReplace(VarStrNull(objDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);

      //link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
      colPartitions := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));

      oEnumPartition := IUnknown(colPartitions._NewEnum) as IEnumVariant;

      while oEnumPartition.Next(1, objPartition, iValue) = 0 do
      begin

         //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
         colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+VarStrNull(objPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition');

         oEnumLogical := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;

         while oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 do
         begin

            if SameText(VarStrNull(objLogicalDisk.DeviceID),Drive+':')  then //compare the device id
            begin

               Result := VarStrNull(objDiskDrive.PnPDeviceID);

               if AnsiStartsText('USBSTOR', Result) then
               begin
                  iValue := LastDelimiter('\', Result);
                  Result := Copy(Result, iValue+1, Length(Result));
               end;

               objLogicalDisk:=Unassigned;

               Exit;

            end;

            objLogicalDisk:=Unassigned;

         end;

         objPartition:=Unassigned;

      end;

      objDiskDrive:=Unassigned;

   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   Drive : Char;
begin
   ListBox1.Clear;
   for Drive := 'A'  to 'Z' do
      if GetDriveType(PChar(Drive + ':\')) = DRIVE_REMOVABLE then
         ListBox1.Items.Add(UpperCase(Drive));
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
  Drive : String;
begin
   Drive := ListBox1.Items.Strings[ListBox1.ItemIndex];
   ShowMessage('USB Serial Number : ' + GetUsbDriveSerial(Drive[1]));
end;

end.
El ejemplo anterior lista las unidades removibles del sistema en un control TListBox y muestra el serial de cada una de ellas al ser seleccionadas por medio del evento OnClick.

El código fuente del ejemplo esta disponible en el link : http://terawiki.clubdelphi.com/Delph...ial+Number.rar

El ejemplo mostrado esta basado en el código encontrado en el link : http://stackoverflow.com/questions/4...sb-flash-drive

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 15-02-2013 a las 19:11:27.
Responder Con Cita