MsftDiscFormat2Data 事件处理程序
Posted
技术标签:
【中文标题】MsftDiscFormat2Data 事件处理程序【英文标题】:MsftDiscFormat2Data Event Handler 【发布时间】:2011-05-17 09:40:53 【问题描述】:我已使用 Interop.cs 成功地将 IMAPI2 集成到我的应用程序中。我可以毫无问题地刻录 CD/DVD。但是,MsftDiscFormat2Data 更新的事件处理程序不起作用,所以我的进度条无法移动。
这是我在 codeproject 网站上找到的代码:
private void backgroundBurnWorker_DoWork(object sender, DoWorkEventArgs e) MsftDiscRecorder2 光盘记录器 = null; MsftDiscFormat2Data discFormatData = null;
try
//
// Create and initialize the IDiscRecorder2 object
//
discRecorder = new MsftDiscRecorder2();
var burnData = (BurnData)e.Argument;
discRecorder.InitializeDiscRecorder(burnData.uniqueRecorderId);
//
// Create and initialize the IDiscFormat2Data
//
discFormatData = new MsftDiscFormat2Data
Recorder = discRecorder,
ClientName = ClientName,
ForceMediaToBeClosed = _closeMedia
;
//
// Set the verification level
//
var burnVerification = (IBurnVerification)discFormatData;
burnVerification.BurnVerificationLevel = _verificationLevel;
//
// Check if media is blank, (for RW media)
//
object[] multisessionInterfaces = null;
if (!discFormatData.MediaHeuristicallyBlank)
multisessionInterfaces = discFormatData.MultisessionInterfaces;
//
// Create the file system
//
IStream fileSystem;
if (!CreateMediaFileSystem(discRecorder, multisessionInterfaces, out fileSystem))
e.Result = -1;
return;
//
// add the Update event handler
//
discFormatData.Update += discFormatData_Update;
//
// Write the data here
//
try
discFormatData.Write(fileSystem);
e.Result = 0;
catch (COMException ex)
e.Result = ex.ErrorCode;
MessageBox.Show(ex.Message, "IDiscFormat2Data.Write failed",
MessageBoxButtons.OK, MessageBoxIcon.Stop);
finally
if (fileSystem != null)
Marshal.FinalReleaseComObject(fileSystem);
//
// remove the Update event handler
//
discFormatData.Update -= discFormatData_Update;
if (_ejectMedia)
discRecorder.EjectMedia();
catch (COMException exception)
//
// If anything happens during the format, show the message
//
MessageBox.Show(exception.Message);
e.Result = exception.ErrorCode;
finally
if (discRecorder != null)
Marshal.ReleaseComObject(discRecorder);
if (discFormatData != null)
Marshal.ReleaseComObject(discFormatData);
void discFormatData_Update([In, MarshalAs(UnmanagedType.IDispatch)] 对象发送者,[In, MarshalAs(UnmanagedType.IDispatch)] 对象进度) // // 检查我们是否取消了 // 如果(背景BurnWorker.CancellationPending) var format2Data = (IDiscFormat2Data)sender; format2Data.CancelWrite(); 返回;
var eventArgs = (IDiscFormat2DataEventArgs)progress;
_burnData.task = BURN_MEDIA_TASK.BURN_MEDIA_TASK_WRITING;
// IDiscFormat2DataEventArgs Interface
_burnData.elapsedTime = eventArgs.ElapsedTime;
_burnData.remainingTime = eventArgs.RemainingTime;
_burnData.totalTime = eventArgs.TotalTime;
// IWriteEngine2EventArgs Interface
_burnData.currentAction = eventArgs.CurrentAction;
_burnData.startLba = eventArgs.StartLba;
_burnData.sectorCount = eventArgs.SectorCount;
_burnData.lastReadLba = eventArgs.LastReadLba;
_burnData.lastWrittenLba = eventArgs.LastWrittenLba;
_burnData.totalSystemBuffer = eventArgs.TotalSystemBuffer;
_burnData.usedSystemBuffer = eventArgs.UsedSystemBuffer;
_burnData.freeSystemBuffer = eventArgs.FreeSystemBuffer;
//
// Report back to the UI
//
backgroundBurnWorker.ReportProgress(0, _burnData);
不幸的是,更新处理程序永远不会被调用。我在互联网上到处查找,但找不到解决方案。我看到有些人有同样的问题,但没有人能够回答。
来自 Eric 的原始代码,http://www.codeproject.com/KB/miscctrl/imapi2.aspx?msg=2695517, 出于某种原因确实有效。
有人可以帮帮我吗?
【问题讨论】:
【参考方案1】:我知道,为时已晚,但我在更新回调方面遇到了同样的问题。
打开 Project->Properties->Application->Assembly Information 并勾选“Make Assembly COM-visible”。
【讨论】:
这是一个答案吗?如果是这样,请展开它。如果没有,请删除它。 哇!!!!你刚刚帮我解决了一个我整整一个月都想弄清楚的问题!!!谢谢你,新年快乐! 这为我解决了这个问题。以上是关于MsftDiscFormat2Data 事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章