मेरे पिछले प्रश्न में "फ्लैश डिवाइस का अद्वितीय सीरियल नंबर कैसे खोजें?" मैं ड्राइव पत्र प्राप्त करने के लिए एक रास्ता मांगने के लिए समाप्त हो गया। वह समस्या हल हो गई है।हमेशा हटाने योग्य डिवाइस का पता लगाने का सबसे अच्छा तरीका
हालांकि, मेरे प्रारंभिक प्रश्न का उत्तर नहीं दिया गया है। मैं हटाने योग्य उपकरणों (यूएसबी ड्राइव, एसडी कार्ड, (बाहरी एचडीडी?) इत्यादि को बताने में सक्षम होना चाहता था) अलग-अलग होते हैं और हमेशा दोबारा कनेक्ट होने पर उन्हें पहचानने में सक्षम होते हैं। यह किसी भी अन्य कंप्यूटर पर भी संभव होना चाहिए। सौभाग्य से, मुझे प्रारूपित किए जाने वाले ड्राइव (यदि/जब वे हैं, तो उन्हें मेरे प्रोग्राम में नए ड्राइव के रूप में माना जाता है) की परवाह नहीं है, तो क्या मैं अपनी पहचान के एक हिस्से के रूप में विभाजन और वॉल्यूम आईडी का उपयोग कर सकता हूं? मैं इसे पीएनपीडीवाइसिस के रूप में पूछ रहा हूं अद्वितीय है। मैंने पाया है कि यह हार्डवेयर इसे पढ़ने पर निर्भर करता है, चित्र नीचे देखें:
alt text http://i48.tinypic.com/28uofmc.png
alt text http://i46.tinypic.com/rk5tv6.jpg
तो, मैं क्या तलाश कर रहा हूँ पता लगाने और उपयोग कर किसी भी कंप्यूटर पर किसी भी हटाने योग्य डिवाइस की पहचान करने के लिए एक रास्ता है निम्नलिखित: Win32_DiskDrive, Win32_DiskPartition, Win32_LogicalDisk। मैं मूल कोड के लिए RRUZ शुक्रिया अदा कर रहा हूँ:
program GetWMI_USBConnectedInfo;
{$APPTYPE CONSOLE}
uses
Windows,
Classes,
ActiveX,
Variants,
SysUtils,
WbemScripting_TLB in '..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';
procedure GetUSBDiskDriveInfo;
var
WMIServices : ISWbemServices;
Root,a,b : ISWbemObjectSet;
Item,Item2 : Variant;
i,ii,iii,iiii: Integer;
start,stop,freq:Int64;
begin
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(start);
WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
Root := WMIServices.ExecQuery('Select * From Win32_DiskDrive','WQL', 0, nil);
for i := 0 to Root.Count - 1 do
begin
Item := Root.ItemIndex(i);
for ii := VarArrayLowBound(Item.Capabilities, 1) to VarArrayHighBound(Item.Capabilities, 1) do if (Item.Capabilities[ii] = 7) then begin
Writeln('Caption '+VarToStr(Item.Caption));
Writeln('Name '+VarToStr(Item.Name));
Writeln('DeviceID '+VarToStr(Item.DeviceID));
Writeln('Partitions '+VarToStr(Item.Partitions));
Writeln('PNPDeviceID '+VarToStr(Item.PNPDeviceID));
Writeln('SerialNumber '+VarToStr(Item.SerialNumber));
Writeln('Signature '+VarToStr(Item.Signature));
a := WMIServices.ExecQuery('ASSOCIATORS OF {Win32_DiskDrive.DeviceID=''' + VarToStr(Item.DeviceID) + '''} WHERE AssocClass = Win32_DiskDriveToDiskPartition','WQL', 0, nil);
for iiii := 0 to a.Count - 1 do begin
b := WMIServices.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID=''' + VarToStr(Variant(a.ItemIndex(iiii)).DeviceID) + '''} WHERE AssocClass = Win32_LogicalDiskToPartition','WQL', 0, nil);
for iii := 0 to b.Count - 1 do begin
Item2 := b.ItemIndex(iii);
Writeln('Drive = ' + Item2.Caption);
end;
end;
Writeln;
Writeln;
end;
end;
QueryPerformanceCounter(stop);
if (freq > 0) then
Writeln('Time took: ' + FloatToStr((stop-start)/freq))
else
Writeln('Unable to measure time!');
end;
begin
try
CoInitialize(nil);
GetUSBDiskDriveInfo;
Readln;
CoUninitialize;
except
on E:Exception do
Begin
CoUninitialize;
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
end.
संपादित
मुझे लगता है कि कोड ड्राइव का पता लगाने के लिए जब वे डाला जाता है पहले से ही काम कर रहा है, हालांकि यह केवल मुझे ड्राइव अक्षर देता जोड़ना चाहिए। मैं डब्ल्यूएमआई से अन्य सभी जानकारी प्राप्त करने के लिए उस ड्राइव अक्षर का उपयोग करता हूं।
अंतिम संपादित
मैंने पढ़ा है कि डेवलपर्स को सुरक्षित रूप से मान्यता के लिए विभाजन/मात्रा आईडी का उपयोग कर सकते हैं। क्या मैं उस पर भरोसा कर सकता हूँ?
समाधान: एक अनूठा साथ ड्राइव पर एक छिपा फ़ाइल
- सहेजें:
तो, "अद्वितीय" आईडी के पढ़ने एक व्यवहार्य समाधान नहीं है के बाद से, वहाँ इस के आसपास पाने के लिए दो तरीके हैं आईडी कि प्रोग्राम पहचान सकता है (स्थानीय डेटाबेस की तुलना में)। - ड्राइव ड्राइव से संबंधित सभी चीज़ों को सहेजें पर एक छिपी हुई सेटिंग्स फ़ाइल के रूप में सहेजें। मैंने इस दृष्टिकोण को लिया क्योंकि कार्यक्रम में स्वयं की कोई सेटिंग नहीं है। सभी सेटिंग्स प्रति विभाजन हैं। यह सेटिंग/प्रोग्राम पोर्टेबल भी बनाता है।
यहाँ मिलियन डॉलर सवाल है? मैं उपयोगकर्ता को डिवाइस का नाम बदलने और पहचान के लिए इसका उपयोग करने के लिए कह सकता हूं। –
उत्कृष्ट। हटाने योग्य डिवाइस पर एक GUID सहेजना और उसे स्थानीय डेटाबेस से तुलना करना (पढ़ना: आईएनआई फ़ाइल) जहां GUID और वॉल्यूम/विभाजन आईडी सहेजी जाती है, यह सुनिश्चित करना चाहिए कि डिवाइस पहचाना जाएगा और भले ही फ़ाइल को वॉल्यूम/विभाजन आईडी मिस्चैच की प्रतिलिपि बनाई गई हो प्रोग्राम को गलत तरीके से पहचानने से प्रोग्राम को रोकना चाहिए। आपका चेकमार्क यहाँ है! –