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

Windows API 實作:列舉與識別 CD-ROM 光碟機磁碟代號

     編輯:關於C++

開發多媒體、燒錄、自動安裝類應用程式時,常需自動偵測系統中的 CD-ROM/DVD 裝置磁碟代號。本文示範使用 GetLogicalDriveStrings 與 GetDriveType API 完整列舉邏輯磁碟並篩選光碟機。

核心 API 介紹

GetLogicalDriveStrings

取得所有邏輯磁碟機根路徑字串,格式:"A:\0C:\0D:\0\0"(雙空字元結尾)。

GetLogicalDrives

位元遮罩形式回傳:bit 0 = A:、bit 1 = B:... 適合位元運算愛好者。

GetDriveType

輸入根路徑(如 "D:\\"),回傳磁碟類型:

常數值說明
DRIVE_UNKNOWN0無效路徑
DRIVE_NO_ROOT_DIR1無根目錄
DRIVE_REMOVABLE2可移動裝置(磁碟機、舊式光碟機)
DRIVE_FIXED3固定硬碟
DRIVE_REMOTE4網路磁碟
DRIVE_CDROM5CD-ROM/DVD
DRIVE_RAMDISK6記憶體虛擬磁碟

完整範例程式 (ListDrives.cpp)

#include <windows.h>
#include <tchar.h>
#include <iostream>
#include <string>
using namespace std;

struct { UINT type; LPCSTR name; } DriveTypeFlags[] = {
    { DRIVE_UNKNOWN, "未知" },
    { DRIVE_NO_ROOT_DIR, "無效路徑" },
    { DRIVE_REMOVABLE, "可移動" },
    { DRIVE_FIXED, "固定" },
    { DRIVE_REMOTE, "網路磁碟" },
    { DRIVE_CDROM, "CD-ROM" },
    { DRIVE_RAMDISK, "RAM磁碟" },
    { 0, NULL }
};

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {
        cerr << "MFC 初始化失敗" << endl;
        return -1;
    }

    TCHAR buf[100];
    DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR), buf);
    
    string msg = "Logical Drives:\n";
    for (TCHAR* s = buf; *s; s += _tcslen(s) + 1) {
        LPCTSTR drivePath = s;
        msg += drivePath; msg += " ";
        
        UINT uDriveType = GetDriveType(drivePath);
        for (int i = 0; DriveTypeFlags[i].name; i++) {
            if (uDriveType == DriveTypeFlags[i].type) {
                msg += DriveTypeFlags[i].name;
                break;
            }
        }
        msg += "\n";
    }
    cout << msg.c_str();
    return 0;
}

關鍵實作細節

  • 字串解析:for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) 正確處理雙空字元結尾
  • Unicode 相容:使用 TCHAR、_tcslen、AfxWinInit 支援 ANSI/Unicode 雙版本建置
  • 查表優化:DriveTypeFlags 陣列索引對應常數值,O(1) 查找
  • 篩選光碟機:if (uDriveType == DRIVE_CDROM) 即可識別

進階應用場景

  • 自動播放/安裝:偵測光碟插入後讀取 autorun.inf
  • 燒錄軟體:列舉可寫入裝置(需進一步判斷 DRIVE_REMOVABLE 並檢查燒錄能力)
  • 多媒體播放器:掃描光碟媒體檔案建立播放清單
  • 系統資訊工具:完整磁碟拓撲報表

原始碼下載

完整 MFC 主控台專案原始碼已附於配套資源。

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