開發音樂播放器、燒錄軟體或自動化測試工具時,常需程式控制光碟機托盤彈出/關閉。Windows 多媒體指令介面 (MCI) 提供簡單字串指令即可完成,無需複雜的 DeviceIoControl。
uses MMSystem;
procedure TForm1.Button1Click(Sender: TObject); { 彈出 }
var
ReturnString: PChar;
begin
GetMem(ReturnString, 128);
try
ReturnString := '驅動器打開錯誤';
mciSendString('set CDAudio door open', ReturnString, 127, 0);
Label1.Caption := ReturnString; { 顯示回傳訊息,成功通常為空字串 }
finally
FreeMem(ReturnString);
end;
end;
procedure TForm1.Button2Click(Sender: TObject); { 關閉 }
var
ReturnString: PChar;
begin
GetMem(ReturnString, 128);
try
ReturnString := '驅動器關閉錯誤';
mciSendString('set CDAudio door closed', ReturnString, 127, 0);
Label1.Caption := ReturnString;
finally
FreeMem(ReturnString);
end;
end;
function mciSendString(lpszCommand: PChar; lpszReturnString: PChar; cchReturn: Integer; hwndCallback: HWnd): MCIERROR;'set CDAudio door open' / 'set CDAudio door closed'。CDAudio 為 MCI 裝置別名,對應第一台 CD-ROM。lpszReturnString 必須預先配置記憶體(GetMem/StrAlloc),長度由 cchReturn 指定。呼叫後若非空字串即為錯誤描述。ReturnString,某些驅動程式會導致存取違規 (AV)。function IsCDDoorOpen: Boolean;
var
Ret: array[0..127] of Char;
begin
mciSendString('status CDAudio mode', Ret, 127, 0);
Result := StrPos(Ret, 'open') <> nil;
end;
MCI 屬舊式多媒體架構,新專案建議使用 CreateFile('\\.\CdRom0', ...) + DeviceIoControl(IOCTL_STORAGE_EJECT_MEDIA),支援多光碟機、USB 光碟機、虛擬光碟機,且不依賴 winmm.dll。
mciSendString 以簡單字串指令控制光碟機,是 Delphi 快速原型開發的經典技巧。理解其回傳緩衝區管理與錯誤處理,能避免常見的存取違規問題。