現代電腦常配備多個光存儲設備:CD-ROM、CD-RW、DVD-ROM、虛擬光驅等。媒體播放軟件需支持多光驅選擇與控制。本文介紹如何枚舉系統光驅並使用 MCI 命令控制光驅門彈出/關閉。
DWORD GetLogicalDrives(VOID);
返回 32 位位掩碼,第 0 位對應 A:,第 1 位對應 B:,以此類推。例如返回值 0x00011101(二進制 0001 0001 0001 0000 0001)表示存在 A:、C:、D:、E: 四個驅動器。
UINT GetDriveType(LPCTSTR lpRootPathName);
參數: 根目錄路徑(如 "D:\\"),NULL 表示當前目錄。
返回值關鍵常量:
DRIVE_CDROM:光驅(目標類型)DRIVE_FIXED:固定硬盤DRIVE_REMOVABLE:可移動磁盤(U盤/軟驅)DRIVE_REMOTE:網絡驅動器DRIVE_RAMDISK:內存盤DRIVE_UNKNOWN / DRIVE_NO_ROOT_DIR:無法識別判斷 F: 是否為光驅:
UINT type = GetDriveType(_T("F:\\"));
if (type == DRIVE_CDROM) printf(_T("F: 是光驅"));
DWORD dwDrives = GetLogicalDrives();
int cdCount = 0;
TCHAR cdLetters[26]; // 存儲光驅盤符字母
for (int i = 0; i < 26; ++i) {
if (dwDrives & (1 << i)) { // 第 i 位為 1,驅動器存在
TCHAR root[4] = { _T('A') + i, _T(':'), _T('\\'), 0 };
if (GetDriveType(root) == DRIVE_CDROM) {
cdLetters[cdCount++] = _T('A') + i;
}
}
}
// cdLetters[0..cdCount-1] 即為所有光驅盤符
動態構建根路徑字符串,避免硬編碼 switch-case 列舉 D: 到 Z:。
MCI (Media Control Interface) 提供設備無關的多媒體控制命令。
void CDRomOpen(BOOL bOpen, TCHAR cDrive) {
MCI_OPEN_PARMS open = { 0 };
MCI_STATUS_PARMS status = { 0 };
TCHAR szDevice[4] = _T("?:");
szDevice[0] = cDrive; // 如 "F:"
open.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_CD_AUDIO;
open.lpstrElementName = szDevice;
DWORD flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE;
if (mciSendCommand(0, MCI_OPEN, flags, (DWORD_PTR)&open) == 0) {
UINT wDeviceID = open.wDeviceID;
if (bOpen) {
mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
} else {
mciSendCommand(wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
}
mciSendCommand(wDeviceID, MCI_CLOSE, MCI_WAIT, 0);
}
}
關鍵點:
MCI_OPEN_SHAREABLE 允許共享設備,避免佔用衝突。MCI_CLOSE 釋放設備 ID。cDrive 可由上述枚舉邏輯動態獲取。MCI_PLAY、MCI_PAUSE、MCI_STATUS 實現完整 CD 播放器。