100分求读SD卡序列号代码非常感谢
解决方案 »
- Playicq.com域名再次受到美国在线的投诉,公布投诉书
- 一个简单的问题,关于null
- 请问如何把SQL数据库里查询出来的日期给DateTimePicker?
- indy upd 问题~
- ado 能和 QUICKREPORT 一起用吗?
- 使用MMSystem进行语音录取和播放,在话筒拔掉时,WaveInOpen怎么不报错?
- 求救!个位大侠
- 大家有没有碰到过这种情况啊?XP下
- No user transaction is currently in progress怎么办?急!!!!
- 急!求installshield for D5的PSW?
- Delphi两个程序不能同时执行,只能执行一个
- 求教:网络数据包的打包
參考msdn描述http://msdn.microsoft.com/en-us/library/ms901392.aspx
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Registry; function GetUSBDiskID(const DiskID:string; var PID:string):Boolean;implementationconst
DIGCF_PRESENT = $00000002;
DIGCF_DEVICEINTERFACE = $00000010;
ANYSIZE_ARRAY = 1;
SetupAPI = 'SetupAPI.DLL';type
HDEVINFO = Pointer;
ULONG_PTR = DWORD; PSPDevInfoData = ^TSPDevInfoData;
SP_DEVINFO_DATA = packed record
cbSize:DWORD;
ClassGuid:TGUID;
DevInst:DWORD;
Reserved:ULONG_PTR;
end;
{$EXTERNALSYM SP_DEVINFO_DATA}
TSPDevInfoData = SP_DEVINFO_DATA; PSPDeviceInterfaceData = ^TSPDeviceInterfaceData;
SP_DEVICE_INTERFACE_DATA = packed record
cbSize:DWORD;
InterfaceClassGuid:TGUID;
Flags:DWORD;
Reserved:ULONG_PTR;
end;
{$EXTERNALSYM SP_DEVICE_INTERFACE_DATA}
TSPDeviceInterfaceData = SP_DEVICE_INTERFACE_DATA; PSPDeviceInterfaceDetailDataA = ^TSPDeviceInterfaceDetailDataA;
SP_DEVICE_INTERFACE_DETAIL_DATA_A = packed record
cbSize:DWORD;
DevicePath:array[0..ANYSIZE_ARRAY - 1] of AnsiChar;
end;
{$EXTERNALSYM SP_DEVICE_INTERFACE_DETAIL_DATA_A}
TSPDeviceInterfaceDetailDataA = SP_DEVICE_INTERFACE_DETAIL_DATA_A;function SetupDiGetClassDevsA(ClassGuid:PGUID; const Enumerator:PAnsiChar;
hwndParent:HWND; Flags:DWORD):HDEVINFO; Stdcall; External SetupAPI;function SetupDiEnumDeviceInterfaces(DeviceInfoSet:HDEVINFO;
DeviceInfoData:PSPDevInfoData; const InterfaceClassGuid:TGUID;
MemberIndex:DWORD; var DeviceInterfaceData:TSPDeviceInterfaceData):BOOL;
Stdcall; External SetupAPI;
{$EXTERNALSYM SetupDiEnumDeviceInterfaces}function SetupDiGetDeviceInterfaceDetailA(DeviceInfoSet:HDEVINFO;
DeviceInterfaceData:PSPDeviceInterfaceData;
DeviceInterfaceDetailData:PSPDeviceInterfaceDetailDataA;
DeviceInterfaceDetailDataSize:DWORD; var RequiredSize:DWORD;
Device:PSPDevInfoData):BOOL; Stdcall; External SetupAPI;function SetupDiDestroyDeviceInfoList(DeviceInfoSet:HDEVINFO):BOOL; Stdcall;
External SetupAPI;function GetUSBDiskID(const DiskID:string; var PID:string):Boolean;
var
USBGuid :TGUID;
USBHandle :HDEVINFO;
Success :LongBool;
Devn :Integer;
DevData :TSPDevInfoData;
DeviceInterfaceData:TSPDeviceInterfaceData;
FunctionClassDeviceData:PSPDeviceInterfaceDetailDataA;
BytesReturned:DWORD;
Reg :TRegistry;
RegData :array of Char;
i, RegSize :Integer;
Str, USBPath :string;
begin
Result := false;
Pid := '';
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('SYSTEM\MountedDevices', false);
RegSize := Reg.GetDataSize(Format('\DosDevices\%s', [DiskID]));
SetLength(RegData, RegSize + 1);
Reg.ReadBinaryData(Format('\DosDevices\%s', [DiskID]), RegData[0], RegSize +
1);
for i := 0 to RegSize - 1 do
if RegData[i] <> #0 then Str := Str + RegData[i];
Str := Copy(Str, Pos('#RemovableMedia#', Str) + 16, Length(Str));
Str := Copy(Str, 1, Pos('RM', Str) - 2);
Str := UpperCase(Str);
Reg.CloseKey;
USBGuid := StringToGUID('{a5dcbf10-6530-11d2-901f-00c04fb951ed}');//{53f56307-b6bf-11d0-94f2-00a0c91efb8b}');
USBHandle := SetupDiGetClassDevsA(@USBGuid, nil, 0, DIGCF_PRESENT or
DIGCF_DEVICEINTERFACE);
if USBHandle = Pointer(INVALID_HANDLE_VALUE) then Exit;
Devn := 0;
repeat DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
Success := SetupDiEnumDeviceInterfaces(USBHandle, nil, USBGuid, Devn,
DeviceInterfaceData);
if Success then
begin DevData.cbSize := SizeOf(DevData);
BytesReturned := 0;
SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData, nil,
0, BytesReturned, @DevData);
if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER)
then
begin FunctionClassDeviceData := AllocMem(BytesReturned);
FunctionClassDeviceData^.cbSize :=
SizeOf(TSPDeviceInterfaceDetailDataA);
if SetupDiGetDeviceInterfaceDetailA(USBHandle,
@DeviceInterfaceData, FunctionClassDeviceData, BytesReturned,
BytesReturned, @DevData) then
begin
USBPath := StrPas(PChar(@FunctionClassDeviceData.DevicePath));
if
Reg.OpenKeyReadOnly(Format('SYSTEM\CurrentControlSet\Enum%s',
[StringReplace(Copy(USBPath, 4, Pos('{', USBPath) - 5), '#',
'\', [rfReplaceAll])])) then
if UpperCase(Reg.ReadString('ParentIdPrefix')) = Str then
begin Delete(USBPath, 1, Pos('#', USBPath));
PID := Copy(USBPath, Pos('#', USBPath) + 1,
Length(USBPath));
PID := Copy(PID, 1, Pos('#{', PID) - 1);
PID := UpperCase(StringReplace(PID, '&', '',
[rfReplaceAll]));
Result := True;
Break;
end;
Reg.CloseKey;
Inc(Devn);
end;
FreeMem(FunctionClassDeviceData);
end;
end;
until not Success;
SetupDiDestroyDeviceInfoList(USBHandle);
finally Reg.Free;
end;
end;end.