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
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function VarStrNull(const V:OleVariant):string; begin
Result:='';
if not VarIsNull(V) then
Result:=VarToStr(V);
end;
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
DeviceID := StringReplace(VarStrNull(objDiskDrive.DeviceID),'\','\\',[rfReplaceAll]);
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
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 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.