一,使用 Windows XP 內置的刻錄功能
參考
http://msdn.microsoft.com/msdnmag/issues/04/04/CQA/
1,簡單文件刻錄
使用 Shell 的 ICDBurn 接口,其中方法:
HasRecordableDrive 掃描系統,如果發現可寫的CD驅動器則返回TRUE。
GetRecorderDriveLetter 返回可寫驅動器。
Burn 執行刻錄動作,從集結區(staging area)寫入 CD-R。
其中,在執行刻錄之前必須先把要刻錄的文件複製到集結區,集結區是一個臨時目錄,位於用戶目錄 "%USERPROFILE%\Local Settings\Application Data\Microsoft\CD Burning" ,也可以通過下面的Shell API獲取:
SHGetFolderPath(CSIDL_CDBURN_AREA)
注意這裏的方法只能用於單個刻錄光驅,如果你有多個刻錄光驅就不行了。
2,音樂CD、CD-RW 等更復雜的刻錄
這裏使用的是 IMAPI (映像控制 Image Mastering API),也是 Windows XP 以上版本支持。IMAPI 可用於查詢刻錄機、寫入數據以及一些叫不出名字的先進功能。
創建 MSDiscMasterObj 對象,該對象有如下接口:
-o IDiscMaster
-o IRedbookDiscMaster
-o IJolietDiscMaster
稍爲解釋一下:CD 一般分爲兩種:音頻CD和數據CD,前者遵循紅皮書規範,後者則爲ISO-9660規範 (也有其它一些數據規範,Joliet是ISO-9660的擴展。)
首先獲得 IDiscMaster 接口,調用 EnumDiscMasterFormats 列舉驅動器支持的媒體格式 (Redbook, Joliet等),根據格式獲取 IRedbookDiscMaster 等對應接口。如果要求更高可以調用 Get/SetActiveDiscMasterFormat 以動態更新。
然後調用 EnumDiscRecorders 列出所有刻錄設備,對應 IDiscRecorder 接口,該接口提供諸如設備路徑、屬性、彈出、擦除 CD-RW 等功能,但不包括寫入數據。
具體的寫入數據根據不同格式而不同,對於數據CD,即Joliet 格式,首先調用 AddData(IStorage*) 方法加入文件、目錄等,而對於音頻CD,即紅皮書格式則首先調用 AddAudioTrackBlocks 加入音軌。這些方法都是將數據拷貝到集結區,而不是立即寫入。
當數據都準備好了,最後調用 IDiscMaster 的 RecordDisc 方法就可以了。這個方法有一個 bSimulate 的參數用於“模擬寫入”,不過你可能永遠不會去用它。
關於 IMAPI 就介紹到這,它雖然比較簡單,不過靠着 Windows XP 這棵大樹,對於VB程序員也差不多足夠了。
二,MCDB - Magic CD/DVD Burner (C/C++ Library)
MCDB 是 Binary Magic 開發的商用 CD/DVD 刻錄組件,易用性比較好,有 VCL 和 ActiveX 兩大類別,Audio/CD/DVD/VCD 等不同媒介的幾個版本,可用於 Delphi, C++ Builder, C#, VB.net, VB, C++ 等開發語言。MCDB支持UDF接口,Unicode字符集,以及多種刻錄機接口,可非常容易的製作MPEG VCD、可啓動光盤等,其核心使用ASPI接口(高級SCSI編程接口,也可用於訪問IDE接口)。
編寫 MCDB 應用程序非常簡單,基本類似於 IMAPI。
首先創建 MCDBurner 對象,屬性 DeviceCount 和 DeviceName[] 查得刻錄機列表。
通過調用 InsertFile/InsertDir 將如要寫入的文件和目錄,然後執行寫入,有幾種不同的寫入方法:
BuildISOImage(filename) 寫入ISO映像文件
BurnISO(isofile) 將 ISO映像文件寫入光盤
Prepare/Burn 直接寫入光盤 (也就是著名的 on-the-fly 寫盤技術)
其它常用的方法有:
EraseDisc 擦除 CD-RW 盤片
DiscIs 判斷媒體類型
MaxWriteSpeed/WriteSpeed 寫入速度
LoadMedium/EjectMedium 裝入和彈出光盤
MCDB 的 120M 試用版可在 www.binarymagics.com 上下載,零售價爲200-400美元不等,同時有源碼出售,價格2000美元左右。
三,hpCDE
hpCDE 是 Primo Software 開發的一款高性能CD/DVD刻錄組件,目前版本1.78,從特性列表中可以看到它對硬件的支持非常多,在寫入中支持 DVD DAO/Incremental、TAO, SAO, DAO, RAW, CD-PLUS 等多種模式,支持 UDF和HFS文件系統,可用於刻錄供Mac OS使用的光盤,以及支持飛盤保護如JustLink, SafeBurn, SmartBurn等高級特性。
相較於前面兩個,hpCDE明顯複雜,沒辦法~ 強大的東西總是複雜的。
先從CD複製開始,工廠類 hpCDE 提供了其它類的構建方法,大致過程如下:
初始化:
hpCDE::CreateEngine 獲得引擎對象
IEngine::Initialize 初始化引擎,其中win 95/98必須使用ASPI,而NT則不用。
IEngine::GetDevices 獲得驅動器列表
- IDeviceCollection::GetItem 枚舉驅動器
- IDevice::GetWritePossible 判斷是否可寫,並忽略不可寫設備
- IDevice::GetDriveLetter 查詢盤符
- IDevice::GetDescription 查詢卷標
- IDevice::GetMediaFreeSpace 判斷是否盤片是否可用
- IDevice::GetMediaIsBlank 判斷是否爲空盤
- IDevice::GetMaxWriteSpeed 最高寫入速度
- IDevice::GetReWritePossible 刻錄機是否支持擦除
- IDevice::GetMediaIsReWritable 盤片是否可擦除
如果希望CD複製並行進行,因此需要建立兩個線程分別用於讀取/寫入,hpCDE 支持多線程模型。hpCDE 支持SAO/TAO/DAO,這裏CD複製使用的是 DAO。對於多段寫入,每個段對應於一個ISession,一個Session可以包含多個Track。
寫入過程:
IDevice::SetCurrentSpeeds 設置寫入速度
IDevice::Eject 彈出盤片
參考
http://www.hpcde.com/documentation/index.html
四,cdrdao, cdrtools
參考:
http://cdrdao.sourceforge.net/
http://freshmeat.net/projects/cdrecord/
http://linuxcommand.org/man_pages/cdrecord1.html
cdrdao 是一款開源 DAO 模式刻錄軟件,有 linux 和 windows 兩個版本。
cdrdao 僅支持一種模式 DAO 即一次完成寫盤,這種模式可以實現一些 pre-gaps 的有趣特性,對於光盤防拷貝,則可以實現 ECC 檢查的技巧。因爲是專門爲 DAO 設計,不是專業人士恐怕無法閱讀其源代碼。
cdrtools 也是開源的,不過它是全功能的,包括IDE/ATAPI/SCSI, 音頻/數據/混合CD,多段刻錄,CD-RW,TAO/DAO/RAW 等等,同時支持很多操作系統