Windows XP 內建 CD 燒錄支援,免購 Nero/Roxio 即可從自有程式實現燒錄。本文詳細解析兩條路徑:簡易 ICDBurn 介面(僅複製檔案/目錄)與 功能完整的 IMAPI (Image Mastering API)(音樂 CD、多裝置枚舉、詳細裝置屬性、模擬燒錄)。附贈封裝類別 CCDBurn、IMAPITools 庫與測試程式 CDINFO。
CCDBurn burner;
if (!burner.HasRecordableDrive()) return; // 1. 偵測可寫裝置
CString drive = burner.GetRecorderDriveLetter(); // 2. 取得燒錄器盤符
CString staging = burner.GetBurnFolderPath(); // 3. 取得「預備區」路徑
%userprofile%\Local Settings\Application Data\Microsoft\CD Burning,務必用 SHGetFolderPath(CSIDL_CDBURN_AREA) 取得真實路徑(用戶可透過 TweakUI 修改)。burner.Burn() 通知 Shell 開始燒錄。
IMAPI 介面繁複(見圖 2),本文提供 IMAPITools 封裝庫隱藏 COM 細節:
| 類別 | 封裝介面 | 主要功能 |
|---|---|---|
CDiscMaster | IDiscMaster | 開啟 Session、枚舉支援格式、選擇作用中燒錄器 |
CDiscRecorder | IDiscRecorder | 代表單一燒錄裝置,查詢型號/類型/路徑、彈出光碟 |
CJolietDiscMaster | IJolietDiscMaster | 資料 CD (Joliet/ISO-9660) 添加檔案/目錄 |
CRedbookDiscMaster | IRedbookDiscMaster | 音樂 CD (Redbook) 添加音軌、原始 PCM 數據寫入 |
CDiscMaster dm; dm.Open(); // 開啟 IMAPI Session
CDiscRecorder dr;
CDiscRecorderIterator itr(dm);
while (itr.Next(dr)) { /* 列舉所有燒錄器 */ }
dm.SetActiveDiscRecorder(dr); // 選擇目標燒錄器
CJolietDiscMaster jdm(dm); // 取得資料燒錄介面
jdm.AddData(storagePtr); // 添加 IStorage 資料流
// 或
CRedbookDiscMaster rdm(dm);
rdm.AddAudioTrackBlocks(pcmData); // 添加 44.1kHz/16bit 原始音訊
dm.RecordDisc(FALSE, TRUE); // 正式燒錄(bSimulate=FALSE, bEject=TRUE)
dm.Close();
RecordDisc(TRUE, ...) 只檢查流程不寫入,適合開發測試。GetSupportedFormats 回傳 IID_IRedbookDiscMaster / IID_IJolietDiscMaster,無需複雜 Enum 介面。CDiscRecorder 可查詢 CD-R/CD-RW、製造商、型號、韌體版本等。
輸出範例:
Recorder: PHILIPS CDRW4800
Type: CD-RW
Path: D:\
Supported Formats: Redbook, Joliet
ICDBurn 最簡潔。IMAPI + IMAPITools。附件含
CCDBurn、IMAPITools完整原始碼與CDINFO專案,VC++ 6.0/XP 編譯通過。