2024年5月30日发(作者:)
DELPHI编程捕获U盘插入或者拔出
翻了下老帖子,月亮写的,根据LS发的MSDN翻译的
源地址:
/u/20090628/16/
Delphi(Pascal)code
functionOpenVolume(ADrive:char):THandle;
var
RootName,VolumeName:string;
AccessFlags:DWORD;
begin
RootName:=ADrive+':'+#134;//ADrive+':'killsthesyntaxhighlighting
caseGetDriveType(PChar(RootName))of
DRIVE_REMOVABLE:
AccessFlags:=GENERIC_READorGENERIC_WRITE;
DRIVE_CDROM:
AccessFlags:=GENERIC_READ;
else
Result:=INVALID_HANDLE_VALUE;
exit;
end;
VolumeName:=Format('.%s:',[ADrive]);
Result:=CreateFile(PChar(VolumeName),AccessFlags,
FILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
ifResult=INVALID_HANDLE_VALUEthen
RaiseLastWin32Error;
end;
functionLockVolume(AVolumeHandle:THandle):boolean;
const
LOCK_TIMEOUT=10*1000;//10Seconds
LOCK_RETRIES=20;
LOCK_SLEEP=LOCK_TIMEOUTdivLOCK_RETRIES;
//#defineFSCTL_LOCK_VOLUMECTL_CODE(FILE_DEVICE_FILE_SYSTEM,
METHOD_BUFFERED,FILE_ANY_ACCESS)
FSCTL_LOCK_VOLUME=(9shl16)or(0shl14)or(6shl2)or0;
var
Retries:integer;
BytesReturned:Cardinal;
begin
forRetries:=1toLOCK_RETRIESdobegin
6,
Result:=DeviceIoControl(AVolumeHandle,FSCTL_LOCK_VOLUME,nil,0,
nil,0,BytesReturned,nil);
ifResultthen
break;
Sleep(LOCK_SLEEP);
end;
end;
functionDismountVolume(AVolumeHandle:THandle):boolean;
const
//#defineFSCTL_DISMOUNT_VOLUMECTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,
METHOD_BUFFERED,FILE_ANY_ACCESS)
FSCTL_DISMOUNT_VOLUME=(9shl16)or(0shl14)or(8shl2)or0;
var
BytesReturned:Cardinal;
begin
Result:=DeviceIoControl(AVolumeHandle,FSCTL_DISMOUNT_VOLUME,nil,0,
nil,0,BytesReturned,nil);
ifnotResultthen
RaiseLastWin32Error;
end;
functionPreventRemovalOfVolume(AVolumeHandle:THandle;
APreventRemoval:boolean):boolean;
const
//#defineIOCTL_STORAGE_MEDIA_REMOVALCTL_CODE(IOCTL_STORAGE_BASE,
0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
IOCTL_STORAGE_MEDIA_REMOVAL=($2dshl16)or(1shl14)or($201shl2)or0;
type
TPreventMediaRemoval=record
PreventMediaRemoval:BOOL;
end;
var
BytesReturned:Cardinal;
PMRBuffer:TPreventMediaRemoval;
begin
tMediaRemoval:=APreventRemoval;
Result:=DeviceIoControl(AVolumeHandle,IOCTL_STORAGE_MEDIA_REMOVAL,
@PMRBuffer,SizeOf(TPreventMediaRemoval),nil,0,BytesReturned,nil);
ifnotResultthen
RaiseLastWin32Error;
end;
functionAutoEjectVolume(AVolumeHandle:THandle):boolean;


发布评论