当前位置: 首页 > news >正文

刻录光盘的程序步骤

​​​​​规范的刻录程序架构流程以及msdn的刻录步骤。

Data burning:

  1. Detect proper drive (IDiscMaster2 => IDiscRecorder2)
  2. Create image IFileSystemImage & fill it:
    • Import old multisessions (if any on media) IDiscFormat2Data::get_MultisessionInterfaces => IFileSystemImage::put_MultisessionInterfaces
    • Import old image (if media is not blank): IFileSystemImage::ImportFileSystem
    • Set up target filesystems & restrictions
    • Fill IFileSystemImage with data (dirs, files & streams), delete unnecessary imported data
    • Set up appropriate properties for each file/dir/stream/image itself
  3. Configure burner IDiscFormat2Data & write your image
    • Set up the drive IDiscFormat2Data::put_Recorder
    • Set up required properties (ForceMediaToBeClosed/write speed/buffer underrun/force overwrite, etc)
    • Prepare & write the stream: IFileSystemImage::CreateResultImage => IFileSystemImageResolt::get_ImageStream => IDiscFormat2Data::Write

翻译过来:

1、检测是否有设备,接口IDiscMaster2检测有多少个设备,获取设备数量以及设备的标识符uniqueID,然后利用设备的标识符(uniqueID),接口IDiscRecorder2初始化到一个刻录机对象。

2、创建文件系统,并且将你要刻录的文件或文件夹给这个接口对象IFileSystemImage。这里需要注意一个问题,使用多重区段刻录时,空白磁盘直接,直接创建文件系统即可,然后刻录。(重要的事情说三遍:不要将put_ForceMediaToBeClosed函数的参数设为TRUE,不要将put_ForceMediaToBeClosed函数的参数设为TRUE,不要将put_ForceMediaToBeClosed函数的参数设为TRUE。因为这会对那些一次写入多次读的磁盘进行完成标识,以后不管磁盘空间剩余多少,都不可以再次刻录啦。我都毁了好多张才学会的道理。微软的说明:

Set to VARIANT_TRUE to mark the disc as closed to prohibit additional writes when the next write session ends.
Set to VARIANT_FALSE to keep the disc open for subsequent write sessions. The default is VARIANT_FALSE

其中,在光盘是空的时候,就要创建文件系统,IFileSystemImage中的put_FileSystemToCreate,参数有这些,用其他函数查询出来,然后再传给这个参数也行,直接指定这些参数也行,毕竟这些参数表示的市场上流行的。FsiFileSystems(None、ISO9660、Joliet、UDF、UNknown),括号里的和前面拼接就行。如果光盘不为空,千万不要在用这个函数创建了。根据我的只读的、追加写的CD\DVD,如果非空盘,第二次还创建,会导致盘不可读。

我追加写是用get_MultisessionInterfaces这个获取SAFEARRAY类型的multiSession,调用put_MultisessionInterfaces这个函数设置多区段写,实现追加写

3、这时候就要准备文件数据啦。IFileSystemImage中的get_Root初始化一个类似与根目录的对象,然后将这个对象与将要刻录的文件数据建立关系。期间也会出现一些问题,比如文件名不合格,文件名冲突、目录名太长。

IFileSystemImage中的CreateResultImage函数必须在文件数据准备完全下调用。输出参数类型是IFileSystemImageResult。

IFileSystemImageResult中的get_ImageStream函数会有一个输出参数,这个参数将上面的文件数据准备到了刻录的缓冲区中,

接着调用IDiscFormat2Data的write函数就可以简单刻录啦。

菜鸟的菜思路,纪念一下。

只看API是不行的,因为就像给你四字成语一样,让你写作文,随便排列是不成作文的。msdn上也有写出刻录光盘的步骤,但是只看别人的不自己思考的话,会记不牢固的。所以就自己写一写吧(不委屈)。

1、IMaster(具体名字都记得不太清楚)接口获取有多少个设备连接到这个系统,可以获取个数并枚举每个设备。

2、Recorder接口(具体名字都记得不太清楚),可以根据1中枚举出的设备来创建一个刻录机,可以获取到刻录机所支持的刻录盘的类型。

3、discFormatData接口,涉及到CD或DVD的文件格式。CD和DVD也是一个类似与硬盘的,保存各种文件就需要各种文件系统,最简单的就是目录和文件名的保存需要按照什么样的格式,这样索引文件才方便嘛。这个接口可以获取到CD和DVD支持的文件格式。

4、image(这个名字就是不正确的,这是我理解的方式,可直接跳过我自己理解的部分) 是文件镜像,根据3获取到文件格式,就能创建出一个文件操作管理器。俗称的镜像。获取到想要刻录的文件的路径,将其转化成要刻录的数据流。

5、ISTREAM(这个我可以肯定)刻录数据流,刻录机调用write函数刻录,真正执行刻录。msdn上说,刻录时最好不要暂停,特别是刻录时间长的话,系统会中断,导致CD或DVD不可用。有两个原因(1、power transitions 2、user to log off 用户注销)

6、写完了,关闭所有需要关闭的,如果想再次追加刻录的话,不要将这个函数 put_ForceMediaToBeClosed设为TRUE。

转自:光盘刻录系列之二刻录光盘的程序步骤_猴面包树的博客-CSDN博客

相关文章:

  • ISO文件
  • DVD-数字通用光盘
  • VCD-影音光碟
  • CD-CompactDisk
  • 光盘的标准与格式
  • Hash-散列函数
  • 索引(index)是什么
  • QT 中文乱码解决汇总(包括QString与string、char*互转乱码)
  • c++中const的作用
  • C++ const 详解
  • QT之QML
  • QNX是什么
  • QT中的pro变量解析
  • Qt编译debug和release版本--CONFIG(debug,debug|release)
  • QMake指南(Pro文件指南)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【个人向】《HTTP图解》阅后小结
  • android图片蒙层
  • css属性的继承、初识值、计算值、当前值、应用值
  • JAVA SE 6 GC调优笔记
  • javascript从右向左截取指定位数字符的3种方法
  • LeetCode算法系列_0891_子序列宽度之和
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 机器学习 vs. 深度学习
  • 基于webpack 的 vue 多页架构
  • 手机端车牌号码键盘的vue组件
  • 小程序01:wepy框架整合iview webapp UI
  • 学习笔记TF060:图像语音结合,看图说话
  • 一份游戏开发学习路线
  • nb
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .Family_物联网
  • .htaccess 强制https 单独排除某个目录
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net Memory Profiler的使用举例
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • [Android View] 可绘制形状 (Shape Xml)
  • [Avalon] Avalon中的Conditional Formatting.
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C puzzle book] types