代码
下载:
http://download.microsoft.com/download/1/6/4/164c2a20-aeb0-460f-907d-985d83e86bd4/CQA0404.exe
MFC没有提供CD刻录的类,但WindowsXp内置了写入CD的支持。如果只是复制文件和目录,可以用shell''s ICDBurn接口。如果要刻录音频或更近一步的实现对音频的控制,那么下面会介绍一个专用的API。
ICDBurn有三个方法,HasRecordableDrive扫描系统内可写的CD驱动器,找到的话返回TRUE。GetRecorderDriveLetter返回可写驱动器的盘符。最后刻录指令通知Windows从“集结区”向可写CD拷贝数据。“集结区”是一个专用的文件夹,通常是"%userprofile%\Local Settings\Application Data\Microsoft\CD Burning", 但还是应该调用SHGetFolderPath和参数CSIDL_CDBURN_AREA获得准确的目录名。开发者会经常用到SHGetFolderPath,因为用户会经常手动或用PowerTools/TweakUI等工具改变刻录的目录。
笔者写了一个很短的类CCDBurn来封装ICDBurn.这个结构用CLSID_CDBurn调用CoCreateInstance,读者可调试运行。
CCDBurn burner;
if (!burner.HasRecordableDrive()) {
printf("Oops—No recordable drive!\n");
} else {
CString dl =
burner.GetRecorderDriveLetter();
printf("Default Recorder drive letter =
%s\n", (LPCTSTR)dl);
}
驱动器盘符是在驱动器记录属性中启动CD记录功能的那个驱动器。只有一个驱动器可以设置这种属性。假定HasRecordableDrive 返回TRUE,也就是电脑至少有一个可记录的CD驱动器,你要做的就是把文件拷贝到集结区内,这就是刻录。
由于笔者很严谨,我又加入了另一个步骤GetBurnFolderPath,调用SHGetSpecialFolderPath 得到一个CString形式的刻录文件目录:
CString path = burner.GetBurnFolderPath();
如果要写入音乐,或找到其他刻录驱动器,或者获得更详细的信息:如驱动器是否是可写的。对此,windows xp提供了IMAPI,它是Image Mastering API的缩写,不要和 MAPI——用于e-mail的Messaging API 混淆。IMAPI提供了COM接口可以寻找可刻录驱动器和写入数据或者指向你最近用过的光驱。
由于与COM的冲突会引起较大的问题,笔者写了一个小的类库,IMAPITools,解决了大多数
问题。为了说明怎么用这个类库笔者还写了一个
程序CDINFO。CDINFO在控制台窗口中显示CD记录体的信息。
只要掌握了IMAPI,CD刻录就不难。但IMAPI很庞大,在讲完基础后再简要的说一下这个问题。
首先,CDINFO创建了一个对象显示驱动器盘符和刻录路径。接着,创建CDiscMaster 打开IMAPI session:
CDiscMaster dm; // create IDiscMaster
if (!dm.Open()) {
printf("Oops: ");
return;
CDiscMaster 封装了第一个主IMAPI 接口IDiscMaster。它调用CoCreateInstance创建 Microsoft MSDiscMasterObj 对象然后得到IDiscMaster 接口。IDiscMaster 例举出格式和记录器,选择活动记录器等。
&nbs