刻录程序报错,调用COM组件失败的问题

问题描述

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;//usingIMAPI2FS;usingIMAPI2.Interop;usingSystem.Runtime.InteropServices.ComTypes;namespaceBurnCD{internalclassRecorder:IRecorder{#regionIRecorder成员///<summary>///刻录机对象///</summary>privateMsftDiscRecorder2m_recorder=null;///<summary>///根据指定的光驱路径,建立光驱对象///</summary>///<paramname="strPath">参数是光驱的标示符</param>internalRecorder(stringstrID){try{m_recorder=newMsftDiscRecorder2();m_recorder.InitializeDiscRecorder(strID);}catch(System.ExceptionEx){thrownewSystem.Exception("根据光驱标示符:"+strID+"建立光驱对象出错");}}///<summary>///不允许通过其他途径建立///</summary>privateRecorder(){}///<summary>///要刻录到这个刻录机中的文件或文件夹///</summary>privateList<IBurnMedia>m_needBurnMedias=newList<IBurnMedia>();///<summary>///要刻录的对象,要想修改要刻录的文件,自己从这里找好了,不再给你提供///其他查询方法///</summary>publicList<IBurnMedia>BurnMediaFileList{get{returnm_needBurnMedias;}}///<summary>///添加刻录文件到这个对象中///</summary>///<returns></returns>publicIBurnMediaAddMediaFile(){//列表中新加一个BurnMedia对象BurnMediaburnMedia=newBurnMedia();m_needBurnMedias.Add(burnMedia);returnburnMedia;}///<summary>///刻录///</summary>///<returns></returns>publicboolBurn(outstringExcep){try{returnDoBurn(outExcep);}catch(System.ExceptionEx){Excep=Ex.Message;returnfalse;}}///<summary>///刻录///</summary>privateboolDoBurn(outstringExcep){//正式的开始刻录MsftDiscFormat2DatamsFormat=newMsftDiscFormat2Data();msFormat.Recorder=m_recorder;msFormat.ClientName="15s";//设置verification等级IBurnVerificationburnVer=(IBurnVerification)msFormat;burnVer.BurnVerificationLevel=IMAPI_BURN_VERIFICATION_LEVEL.IMAPI_BURN_VERIFICATION_FULL;//检查是否是blankobject[]sessions=null;if(false==msFormat.MediaHeuristicallyBlank){sessions=(object[])msFormat.MultisessionInterfaces;}//创建文件流IStreamfileStream=null;if(false==CreateFileStream(refsessions,outfileStream,outExcep)){returnfalse;}//写文件try{msFormat.Write(fileStreamasSystem.Runtime.InteropServices.ComTypes.IStream);Excep="WritefiletoDVDsuccess!";returntrue;}catch(System.ExceptionEx){Excep=Ex.Message;returnfalse;}finally{if(fileStream!=null){Marshal.FinalReleaseComObject(fileStream);}}}///<summary>///创建文件流///</summary>///<paramname="sessions"></param>///<paramname="stream"></param>///<returns></returns>privateboolCreateFileStream(refobject[]sessions,outIStreamstream,outstringExcep){MsftFileSystemImagemsImage;try{//设置相关信息msImage=newMsftFileSystemImage();msImage.ChooseImageDefaults(m_recorder);msImage.FileSystemsToCreate=FsiFileSystems.FsiFileSystemISO9660|FsiFileSystems.FsiFileSystemJoliet;msImage.VolumeName="ABC";//以下为抄的,没看懂if(sessions!=null){msImage.MultisessionInterfaces=sessions;msImage.ImportFileSystem();}IFsiDirectoryItemrootItem=msImage.Root;foreach(BurnMediabminm_needBurnMedias){//依次刻录bm.AddToFileSystem(rootItem);}stream=msImage.CreateResultImage().ImageStream;Excep="Createfilestreamsuccess!";returntrue;}catch(System.ExceptionEx){stream=null;Excep=Ex.Message;returnfalse;}}privatelongm_nDiskSize=0;privatelongm_nUseableSize=0;///<summary>///获取光驱中光盘的大小,单位是字节///</summary>///<returns>如果返回-1,则说明当前光驱中没有光盘或者光盘读取错误</returns>publiclongGetDiskSize(){//首先判断光驱是否可以读盘IDiscFormat2DatamsFormat=newMsftDiscFormat2Data();if(msFormat.IsRecorderSupported(m_recorder)==false){//光驱不支持这种格式光盘,或者没有怎么的return-1;}//以下代码,还没有研究明白msFormat.Recorder=m_recorder;//判断是不是有光盘在里面try{IMAPI_FORMAT2_DATA_MEDIA_STATEst=msFormat.CurrentMediaStatus;}catch(System.Exceptionex){//光盘不存在return-1;}//可用的m_nUseableSize=msFormat.FreeSectorsOnMedia*2048;//总大小m_nDiskSize=(msFormat.TotalSectorsOnMedia)*2048;returnm_nDiskSize;}///<summary>///获取可用的光盘空闲空间///</summary>///<returns></returns>publiclongGetDiskUseableSize(){GetDiskSize();returnm_nUseableSize;}#endregion}}然后我写了一个接口实现刻录文件的功能:publicintBurnCD(stringRecordPartition,stringRecordFilePath,outstringExcep){IBurnCDBcd=IBurnCD.CreateInstance();List<string>StrRecorder=Bcd.GetRecorderList();stringPartitionName=StrRecorder.Find(delegate(stringPartition){returnPartition.Equals(RecordPartition);});if(String.IsNullOrEmpty(PartitionName)){Excep="Specifiedpartitionisnotexist!";return1;}if(!File.Exists(RecordFilePath)){Excep="Thefileisnotexist!";return2;}IRecorderRecord=Bcd.GetRecorder(RecordPartition);IBurnMediaBurnMedia=Record.AddMediaFile();BurnMedia.Path=RecordFilePath;BurnMedia.Type=MediaType.File;boolbRet=Record.Burn(outExcep);if(bRet)return0;elsereturn3;}上面的代码在刻录大概800M以下的文件没有问题,但是在刻录800M以上的文件的时候就会抛异常,提示“调用COM组件时失败”请哪位大侠指点?

解决方案

解决方案二:
上面的程序在msFormat.Write(fileStreamasSystem.Runtime.InteropServices.ComTypes.IStream);这条语句执行的时候抛异常了,调用COM组件失败,但是写小文件的时候不会抛异常,返回是成功的。请高手指点原因,不胜感激!高分送上!

时间: 2025-01-30 06:41:35

刻录程序报错,调用COM组件失败的问题的相关文章

微信H5调起微信支付,报错支付验证签名失败

问题描述 微信H5调起微信支付,报错支付验证签名失败 5C 获取prepareId 时候正常但是通过WeixinJSBridge.invoke('getBrandWCPayRequest' )调取的时候就会报 <支付验证签名失败>签名是通过微信提供的工具验证过的一致 公众平台的授权网址也写的没问题商户key也是没问题(获取prepareId没问题就应该不是这的问题吧) 求大家帮忙 解决方案 微信支付不是需要进行ASC值进行排序么,排查下你写的顺序是否正确

sqlserver-关于eclipse连接sql server2005报错 用户sa登录失败

问题描述 关于eclipse连接sql server2005报错 用户sa登录失败 各种方法都试过了,TCP开了 sql服务也开了,browser也重启了 ,sql驱动加载了 ..数据库可以登录,求大神帮忙啊... 解决方案 你数据库可以登录,是用sa登录的,还是用Windows集成验证登录的?请确保启用了sa登录 解决方案二: 上面的答案有帮助吗?如果还有问题,请提出来,如果对答案满意,请顶一下,并标记为采纳答案,谢谢! 解决方案三: 你这个跟什么TCP的没关系,那个一般是sa的密码问题或者没

Win10系统安装iTunes软件报错怎么办 安装iTunes失败解决办法

当前大家都安装了Windows 10系统,对于使用苹果iPhone手机的话,有时候需要在系统中安装iTunes软件,用于管理iPhone手机.有时会遇到在Win10中安装iTunes软件时会遇到报错,从而导致安装失败的问题.这里简单介绍下怎么处理在 Windows10 中不能安装 iTunes 的方法.   1.如下图所示,这是在 Windows10 系统中安装 iTunes 软件报错的截图:     2.当遇到这样的情况时,请先在 Windows10 系统中进入控制面板,可以通过右键点击开始菜

Windows 7开机报错“登录进程初始化失败”怎么办

如下图所示在开机时还没有进入到系统会提示"交互式登录进程初始化失败"错误了,对于这个问题我们来看它的解决办法. 1.进入不了系统了我们现在重启电脑,然后进入到高级启动选项,在开始时我们按住F8,然后会进入到高级启动选项,我们使用光标上下移动到"最后一次的正确配置"选项,看可否正常进入系统,如图: 2.操作无效,开机时如上图操作出现启动菜单,用键盘"↓"键选择"安全模式"按"回车"两次进入安全模式,如果系统提

xfire webservices-xfire 调用 webservices 报错

问题描述 xfire 调用 webservices 报错 调用别人写的webservices 但是报错 Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: java.lang.String.isEmpty()Z 本地客户端代码: Cli

存储过程-Java调用存储国过程报错

问题描述 Java调用存储国过程报错 调用代码如下,求大神指正 package com.lofter.svntesr; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java

VB中使用lead控件加载jpg图片报错

问题描述 VB中使用lead控件加载jpg图片报错 调用LEAD1.BitmapDataPath = "111.jpg"时报错,换成111.bmp就没有问题,这种现象其他电脑没有,是什么问题 解决方案 这个不好说,你的图片没法解析,建议先转换成标准的位图格式再加载.

radupload控件使用时报错“调用的目标发生了异常”怎么处理?

问题描述 radupload控件使用时报错"调用的目标发生了异常"怎么处理? radupload控件服务端RadUploadHandler走完GetAssociateData()函数时,不返回执行前台FileUploaded事件,而是报错"调用的目标发生了异常",请问怎么处理?

股票-通信达绑定dll文件报错

问题描述 通信达绑定dll文件报错 使用通信达股票软件绑定dll文件报错如下:绑定失败!此DLL不符合要求. 这应做何解释? 解决方案 http://help.tdx.com.cn/book.asp 通达信DLL函数编程规范.rar 下载这个规范,看你的哪里不符合要求.