function EjectMedia(DriveLetter: string): boolean;
var
hr: THandle;
buffer: Cardinal;
begin
hr := CreateFile(PChar('\\.\' + DriveLetter + ':'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hr <> INVALID_HANDLE_VALUE then
if DeviceIOControl(hr, IOCTL_STORAGE_EJECT_MEDIA, nil, 0, nil, 0, buffer, nil) then
result := true
else
result := false;
CloseHandle(hr);
end;procedure TForm1.Image34Click(Sender: TObject);
begin
EjectMedia(Change_U);//要如何在这里调用呢?这样好像不对本人新菜多指教,Change_U是当前盘符
end;
const
IOCTL_STORAGE_EJECT_MEDIA = $2D4808;
IOCTL_STORAGE_LOAD_MEDIA = $2D480C;
function LoadMedia(DriveLetter: String): Boolean;
var
hr:THandle;
buffer: Cardinal;
begin
hr := CreateFile(PChar('\\.\'+DriveLetter+':'), GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE, NIL, OPEN_EXISTING, 0, 0);
if hr <> INVALID_HANDLE_VALUE then
if DeviceIOControl(hr, IOCTL_STORAGE_LOAD_MEDIA, NIL, 0, NIL, 0, buffer, NIL) then
result := true
else
result := false;
CloseHandle(hr);
end;
//Fährt die Schublade aus
function EjectMedia(DriveLetter: String): Boolean;
var
hr:THandle;
buffer: Cardinal;
begin
hr := CreateFile(PChar('\\.\'+DriveLetter+':'), GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE, NIL, OPEN_EXISTING, 0, 0);
if hr <> INVALID_HANDLE_VALUE then
if DeviceIOControl(hr, IOCTL_STORAGE_EJECT_MEDIA, NIL, 0, NIL, 0, buffer, NIL) then
result := true
else
result := false;
CloseHandle(hr);
end;
论坛老资料上的,据说这个函数可以删除和复位USB设备
要如何用一个按钮实现删除某个盘符的USB设备呢?
DeviceIoControl(hDevice:THandle; dwIoControlCode:DWORD; lpInBuffer:Byte; nInBufferSize:DWORD;
lpOutBuffer:Byte; nOutBufferSize:DWORD; lpBytesReturned:DWORD; lpOverlapped:PChar;)
hDevice 是从CreateFile返回的VxD句柄。
dwIoControlCode 是用来制定VxD将要进行的操作。
lpInBuffer 是包含了VxD完成dwIoControlCode所制定操作的数据的缓冲区地址。
如果这个操作不需要数据,可以传为NIL。
nInBufferSize 是由lpInBuffer所指向的缓冲区的地址的大小(byte)。
lpOutBuffer 是VxD程序在操作成功之后要将输出数据输出到的缓冲区。
如果这个操作没有任何返回值,这个值为NIL。
nOutBufferSize 是lpOutBuffer所指向的缓冲区的大小(byte)。
lpBytesReturned 是一个dword型变量的地址。这个变量用来接收VxD在lpOutBuffer中写入数据的大小。
lpOverlapped 是一个指针。如果你要一直等到操作完成,这个值应该赋为NIL。
例如:
var
A : THandle;
B : Byte;
C : DWORD;
DeviceIOControl (A, VWIN32_DIOC_DOS_INT13, @B, SizeOf (B), @B, SizeOf (B), C, nil) ;
begin
if EjectMedia(Change_U) then//要如何在这里调用呢?这样好像不对本人新菜多指教,Change_U是当前盘符
ShowMessage('执行成功')
else
ShowMessage('执行不成功')
end;
const
IOCTL_STORAGE_EJECT_MEDIA = $2D4808;
IOCTL_STORAGE_LOAD_MEDIA = $2D480C;
这个常量放在程序代码最开始的 const下就可以了对吧?
调用好像没有问题
好像是这里的问题执行到if hr <> INVALID_HANDLE_VALUE then的时候,
hr 和 INVALID_HANDLE_VALUE是相等的