关于程序u盘加密 写了个程序 要用u盘加密,也就是插上u盘后这个程序才能运行 这个要怎么实现啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以读取USB口的序列号得信息,序列号对不上就不运行 constDIGCF_PRESENT = $00000002;DIGCF_DEVICEINTERFACE = $00000010;ANYSIZE_ARRAY = 1;SetupAPI = 'SetupAPI.DLL';typeHDEVINFO = Pointer;ULONG_PTR = DWORD;PSPDevInfoData = ^TSPDevInfoData;SP_DEVINFO_DATA = packed recordcbSize: DWORD;ClassGuid: TGUID;DevInst: DWORD;Reserved: ULONG_PTR;end;{$EXTERNALSYM SP_DEVINFO_DATA}TSPDevInfoData = SP_DEVINFO_DATA;PSPDeviceInterfaceData = ^TSPDeviceInterfaceData;SP_DEVICE_INTERFACE_DATA = packed recordcbSize: 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 recordcbSize: 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;varUSBGuid: 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;beginResult := false;Pid := '';Reg := TRegistry.Create;tryReg.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 doif 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('{53f56307-b6bf-11d0-94f2-00a0c91efb8b}');USBHandle := SetupDiGetClassDevsA(@USBGuid, nil, 0, DIGCF_PRESENT orDIGCF_DEVICEINTERFACE);if USBHandle = Pointer(INVALID_HANDLE_VALUE) then Exit;Devn := 0;repeatDeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);Success := SetupDiEnumDeviceInterfaces(USBHandle, nil, USBGuid, Devn,DeviceInterfaceData);if Success thenbeginDevData.cbSize := SizeOf(DevData);BytesReturned := 0;SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData, nil,0, BytesReturned, @DevData);if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) thenbeginFunctionClassDeviceData := AllocMem(BytesReturned);FunctionClassDeviceData^.cbSize := SizeOf(TSPDeviceInterfaceDetailDataA);if SetupDiGetDeviceInterfaceDetailA(USBHandle, @DeviceInterfaceData,FunctionClassDeviceData, BytesReturned, BytesReturned, @DevData) thenbeginUSBPath := StrPas(PChar(@FunctionClassDeviceData.DevicePath));if Reg.OpenKeyReadOnly(Format('SYSTEM\CurrentControlSet\Enum%s',[StringReplace(Copy(USBPath, 4, Pos('{', USBPath) - 5),'#', '\', [rfReplaceAll])])) thenif UpperCase(Reg.ReadString('ParentIdPrefix')) = Str thenbeginDelete(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);finallyReg.Free;end;end;//使用方法:procedure TForm1.Button1Click(Sender: TObject);varDrv, Pid: string;beginDrv := ExtractFileDrive(ParamStr(0));if GetDriveType(PChar(Drv + '\')) <> DRIVE_REMOVABLE thenApplication.MessageBox('对不起,请把本程序放至到优盘上使用!', 'Error', MB_ICONHAND)else if GetUSBDiskID(Drv, Pid) then ShowMessage(Pid);end; 请教各位这段系统加速代码为何没有起作用? 播放一首歌曲和一端 SQLSERVER如何去访问其它类型的数据库? 小问题,请进...... 如何排序,急,马上接分! 请解决了clientdataset的filter中使用like过滤中文单汉字的高手进来解决一下 做过三层的大侠,请进来帮帮忙!真让我头痛! 关于 自定义类型 中使用 string 的问题! 一个简单的问题 关于日志实现的问题? 在dbgrid中修改数据时,发现数据不合要求,怎么取消提交? 如何阅读DELPHI源码
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('{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;
//使用方法:
procedure TForm1.Button1Click(Sender: TObject);
var
Drv, Pid: string;
begin
Drv := ExtractFileDrive(ParamStr(0));
if GetDriveType(PChar(Drv + '\')) <> DRIVE_REMOVABLE then
Application.MessageBox('对不起,请把本程序放至到优盘上使用!', 'Error', MB_ICONHAND)
else if GetUSBDiskID(Drv, Pid) then ShowMessage(Pid);
end;