我试过这个代码:
uses MMSystem; mciSendString('Set cdaudio door open wait',nil,handle); mciSendString('Set cdaudio door closed wait',handle);
但没有效果。 我听说这不适用于所有系统。
我试图让驱动器在Windows XP上popup,并且想通过驱动器盘符指定驱动器(对于具有多个驱动器的系统是必需的)。
如何在Delphi中获取创build/最后修改文件的date?
在ILCreateFromPath和错误检查
在Kylix等待
Delphi:如何知道TEdit何时改变大小?
替代TControl.Perform
在Windows x64上用RtlAddFunctionTable描述dynamic生成的代码
有没有办法睡觉,除非收到消息?
URIscheme启动
Windows服务:在指定的时间工作(Delphi)
delphi的GDI行距?
这是使用DeviceIOControl() API函数的代码,适用于Windows XP(使用Delphi 5进行编译和测试):
function DeviceIOControlHelper(ADeviceHandle: THandle; ADeviceIOControlCode: DWORD): boolean; var BytesReturned: Cardinal; begin Result := DeviceIOControl(ADeviceHandle,ADeviceIOControlCode,BytesReturned,nil); end; function SetDriveDoorOpen(ADriveLetter: char; AValue: boolean): boolean; const FILE_DEVICE_FILE_SYstem = 9; FILE_ANY_ACCESS = 0; FILE_READ_ACCESS = 1; METHOD_BUFFERED = 0; IOCTL_STORAGE_BASE = $2D; (* #define CTL_CODE( DeviceType,Function,Method,Access ) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) *) // FSCTL_LOCK_VOLUME = CTL_CODE(FILE_DEVICE_FILE_SYstem,6,// METHOD_BUFFERED,FILE_ANY_ACCESS); FSCTL_LOCK_VOLUME = (FILE_DEVICE_FILE_SYstem shl 16) or (FILE_ANY_ACCESS shl 14) or (6 shl 2) or METHOD_BUFFERED; // FSCTL_dismoUNT_VOLUME = CTL_CODE(FILE_DEVICE_FILE_SYstem,8,FILE_ANY_ACCESS); FSCTL_dismoUNT_VOLUME = (FILE_DEVICE_FILE_SYstem shl 16) or (FILE_ANY_ACCESS shl 14) or (8 shl 2) or METHOD_BUFFERED; // IOCTL_STORAGE_EJECT_MEDIA = CTL_CODE(IOCTL_STORAGE_BASE,0x0202,FILE_READ_ACCESS); IOCTL_STORAGE_EJECT_MEDIA = (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or ($0202 shl 2) or METHOD_BUFFERED; // IOCTL_STORAGE_LOAD_MEDIA = CTL_CODE(IOCTL_STORAGE_BASE,0x0203,FILE_READ_ACCESS); IOCTL_STORAGE_LOAD_MEDIA = (IOCTL_STORAGE_BASE shl 16) or (FILE_READ_ACCESS shl 14) or ($0203 shl 2) or METHOD_BUFFERED; var DriveCmdstr: string; DriveHandle: THandle; begin Result := FALSE; DriveCmdstr := Format('\.%s:',[ADriveLetter]); DriveHandle := CreateFile(PChar(DriveCmdstr),GENERIC_READ,FILE_SHARE_WRITE,OPEN_EXISTING,0); if DriveHandle <> INVALID_HANDLE_VALUE then begin if AValue then begin Result := DeviceIOControlHelper(DriveHandle,FSCTL_LOCK_VOLUME) and DeviceIOControlHelper(DriveHandle,FSCTL_dismoUNT_VOLUME) and DeviceIOControlHelper(DriveHandle,IOCTL_STORAGE_EJECT_MEDIA); end else Result := DeviceIOControlHelper(DriveHandle,IOCTL_STORAGE_LOAD_MEDIA); CloseHandle(DriveHandle); end; end;
错误处理省略。
uses ComObj; function EjectDrive(const ADriveLetter: string): Boolean; var WMP: Variant; CDROMs: Variant; Drive: Variant; begin WMP := CreateOleObject('WMPlayer.OCX.7'); CDROMs := WMP.CDROMCollection; Drive := CDROMs.GetByDriveSpecifier(ADriveLetter + ':'); Drive.Eject; end; procedure TForm1.FormCreate(Sender: TObject); begin EjectDrive('Q'); end;
编辑:正如你所看到的,我没有写任何错误处理代码。 如果指定的驱动器无效,此代码将引发异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。