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

VC++ 多光驅枚舉與控制:獲取光驅列表、MCI 命令彈出/關閉光驅門

     編輯:關於VC++

前言

現代電腦常配備多個光存儲設備:CD-ROM、CD-RW、DVD-ROM、虛擬光驅等。媒體播放軟件需支持多光驅選擇與控制。本文介紹如何枚舉系統光驅並使用 MCI 命令控制光驅門彈出/關閉。

一、枚舉邏輯驅動器:GetLogicalDrives

DWORD GetLogicalDrives(VOID);

返回 32 位位掩碼,第 0 位對應 A:,第 1 位對應 B:,以此類推。例如返回值 0x00011101(二進制 0001 0001 0001 0000 0001)表示存在 A:、C:、D:、E: 四個驅動器。

二、判斷驅動器類型:GetDriveType

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 控制光驅門彈出/關閉

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 播放器。
  • 算法純 API 實現,易移植到 VB、Delphi、C# (P/Invoke) 等語言。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved