首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 控制 CD-ROM 光碟機彈出與關閉:mciSendString 多媒體指令

     編輯:Delphi

前言

開發音樂播放器、燒錄軟體或自動化測試工具時,常需程式控制光碟機托盤彈出/關閉。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;

關鍵點解析

  • mciSendString: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;

現代替代方案:IOCTL_STORAGE_EJECT_MEDIA

MCI 屬舊式多媒體架構,新專案建議使用 CreateFile('\\.\CdRom0', ...) + DeviceIoControl(IOCTL_STORAGE_EJECT_MEDIA),支援多光碟機、USB 光碟機、虛擬光碟機,且不依賴 winmm.dll。

結語

mciSendString 以簡單字串指令控制光碟機,是 Delphi 快速原型開發的經典技巧。理解其回傳緩衝區管理與錯誤處理,能避免常見的存取違規問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved