2010-11-29 204 views
4

我已经成功地将使用Interop.cs的IMAPI2集成到我的应用程序中。我可以刻录CD/DVD没有任何问题。但是,MsftDiscFormat2Data更新的事件处理程序不起作用,所以无法移动我的进度条。MsftDiscFormat2Data事件处理程序

这里是我发现在CodeProject网站的代码:

私人无效backgroundBurnWorker_DoWork(对象发件人,DoWorkEventArgs E) { MsftDiscRecorder2 discRecorder = 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); 
      } 
     } 
    } 

无效discFormatData_Update([在,的MarshalAs(UnmanagedType.IDispatch)对象发件人,[在,的MarshalAs(UnmanagedType.IDispatch)对象进度) {// // 检查,我们已取消 // if(backgroundBurnWorker.CancellationPending) var format2Data =(IDiscFormat2Data)sender; format2Data.CancelWrite(); return; }

 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, 确实有效。

有人可以帮我吗?

回答

7

我知道,这太晚了,但我有更新回调相同的问题。

打开Project-> Properties-> Application-> Assembly Information并勾选“Make Assembly COM-visible”。

+1

这是一个答案?如果是这样,请展开它。如果没有,请删除它。 – 2012-11-13 03:21:38