۲۶-شهریور-۱۳۹۴, ۱۲:۵۲:۴۲
سلام
چرا وقتی از کد زیر در تایمر و یا در رویدادی که usb فعال می شود استفاده می کنم این کد کار نمی کند ولی وقتی همین کد در یک دکمه مینویسم و بعد کلیک می کنم به درستی کار می کند.
منظورم اینه که کد زیر چطور میشه به طور خودکار فعال بشه؟؟ نه اینکه بخواهیم کلیک کنیم بعد فعال شود؟؟
من حتی از CoInitialize(nil); // uses Winapi.ActiveX هم استفاده کردم ولی بازم هیچ فرقی نمی کند!!!
لطفا راهنمایی کنید، با تشکر.
چرا وقتی از کد زیر در تایمر و یا در رویدادی که usb فعال می شود استفاده می کنم این کد کار نمی کند ولی وقتی همین کد در یک دکمه مینویسم و بعد کلیک می کنم به درستی کار می کند.
منظورم اینه که کد زیر چطور میشه به طور خودکار فعال بشه؟؟ نه اینکه بخواهیم کلیک کنیم بعد فعال شود؟؟
من حتی از CoInitialize(nil); // uses Winapi.ActiveX هم استفاده کردم ولی بازم هیچ فرقی نمی کند!!!
لطفا راهنمایی کنید، با تشکر.
کد:
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
function GetUsbDriveSerial(const Drive : Char) : 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
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.