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 事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

python asyncio 协程使用

抽丝剥茧聊Kotlin协程之协程异常处理机制分析

是否可以在 Qt3.0 中发出跨进程信号或发布触摸/鼠标单击事件?

不使用Dispose事件处理程序处理应用程序关闭事件

学习笔记JS之事件(上)

Backbone 和 Strophe muc 插件:处理传入事件