MsftDiscFormat2Data event handler

I have successfully integrated IMAPI2 with Interop.cs in my application. I can burn CD / DVD without any problems. However, the event handler for updating MsftDiscFormat2Data does not work, so I cannot make the progress move.

Here is the code I found on the codeproject website:

private void backgroundBurnWorker_DoWork (object sender, 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); } } } 

void discFormatData_Update ([In, MarshalAs (UnmanagedType.IDispatch)] sender of the object, [In, MarshalAs (UnmanagedType.IDispatch)] object progress) {// // Check if we canceled // 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); } 

Unfortunately, the update handler is never called. I searched everywhere on the Internet, but could not find a solution. I saw some people with the same problem, but no one could answer.

The source code from Eric, http://www.codeproject.com/KB/miscctrl/imapi2.aspx?msg=2695517 , for some reason works.

Can anyone help me out?

+4
source share
1 answer

I know this is too late, but I have the same problem with update callbacks.

Go to Project-> Properties-> Application-> Assembly Information and check "Make assembly visible."

+7
source

All Articles