Laden...

[Tutorial] CDs Brennen mit C# und Nero API

Erstellt von alexander vor 20 Jahren Letzter Beitrag vor 16 Jahren 153.833 Views
alexander Themenstarter:in
2.217 Beiträge seit 2003
vor 20 Jahren
[Tutorial] CDs Brennen mit C# und Nero API

Hi,

guenni81 hat sich die Mühe gemacht und ein Tutorial geschrieben, welches beschreibt wie man mit Hilfe von C# sowie NeroAPI CDs brennen kann.

Also viel Spaß beim Lesen und nochmal vielen Dank an guenni81.

Viele Grüße
Alexander

E
2 Beiträge seit 2004
vor 19 Jahren

Dank auch von mir an guenni81

G
18 Beiträge seit 2004
vor 19 Jahren

Super Tutorial 👍
Gibts eigentlich ausser dem pdf, das bei dem NeroCom SDK dabei ist noch eine Beschreibung der Bibliothek? Bitte kein VB - davon hab ich null Ahnung. Will naemlich um die (RCW) gewrappte Library eine einfache .NET-Komponente basteln - d.h. nur die Funktionen anbieten die ich brauche. Noch leider blick ichs noch net ganz. Da steckt einfach zuviel Funktionalitaet drin.
Beispiele waeren auch klasse. Habe hier leider keinen Brenner eingebaut, deswegen wuerd ich gern mit dem Image-Recorder testen. Ich brauch doch nur den Haendler hinzufuegen und dort den string mit dem Target-path+name zu ueberschreiben?

neroClass.OnFileSelImage += new NEROLib._INeroEvents_OnFileSelImageEventHandler(OnFileSelImage);

Gibts einen globalen Fehlerhandler? Hab irgendwie kein passendes Event gefunden. Welche Events sollte man denn alle behandeln?
Gibts eine Funktion um ein Verzeichnis + alle Unterverzeichnisse inkl. Inhalt einer NeroFolderClass zu adden? Oder muss ich (muehsam) mich durch alles durchhangeln und jedes File einzeln adden?

Danke schonmal fuer Hilfe 🙂

G
205 Beiträge seit 2003
vor 19 Jahren

@Gumble
Es gibt leider soweit ich damals gefunden habe nur sehr wenige informationen zu der NeroAPI. Wenn du Informationen unter google suchst, bekommst du meist VB anwendung/beispiele. Es ist schon ziemlich lange her das ich das letzte mal etwas in C# gemacht habe. Das einzigste was dir bleibt ist suchen. Für das problem mit dem Pfad und den Dateien adden könntest du dir ja ne eigene Funktion schreiben wenn es wirklich nix geben sollte.

G
18 Beiträge seit 2004
vor 19 Jahren

Also ich habe mich jetzt noch weiter damit auseinander gesetzt - es klappt zwar schon ganz gut, aber sehr transparent ist das alles nicht. Ab und an krieg ich Fehler aufgrund 2 asynchroner Operations - passiert beim debuggen nicht - abhilfe durch (halb)aktives warten und statusvariable: habe vor und nach dem BurnIsoAudioCD-Aufruf eine solche Schleife um den internen hochprioren NeroThread genuegend Zeit zum werkeln zu geben:
while(longOperation == true)
{
Thread.Sleep(500);
Console.WriteLine("locked");
}
die longOperation variable entsperre ich in den EventHandlermethoden OnDoneBurn und nDrive_OnDoneEstimateTrackSize.
Ich glaube mein Design ist grausam 🙂
Jedenfalls klappt es nicht mehr wenn ich anstelle der Consolenausgabe (z.B. in OnProgress - Methode) den aktuellen Status in einem Form visualisiere (beinhaltet eine Progressbar). Schon allein das halten einer Instanz [edit: nein, war zu uebereifrig - siehe Beitrag spaeter] veranlasst den Nerothread keine Events mehr zu senden so dass ich natuerlich auch nie aus meiner Speerschleife rauskomme. Verstehen tu ichs nicht.
Wems interessiert, kann ich den Code ja gezippt zukommen lassen, oder ich stell ihn hier rein. Muss ihn aber erstmal bisschen saeubern 🙂 Ziel meines Vorhabens: eine schlanke .NET dll mit der man mit einem einzigen static Aufruf einfach eine cd/dvd brennen kann - so nach der Art Burn(string label, string folder, string imagePath, string recorder, int speed, string cdtype).

Y
220 Beiträge seit 2004
vor 19 Jahren
Interessiert !

Hallo Gumble (+Co)!

Wär echt super, wenn du dein Projekt mal hochladen könntest
und die URL posten, oder wenn du mir es kurz
an michijaroAThotmailDOTcom
mailst.

Vielen Dank,

Yahoo

G
18 Beiträge seit 2004
vor 19 Jahren

das Ganze Projekt lade ich lieber nicht hoch - nerocom wie in der Anleitung selber wrappen! geht ganz einfach. Hier der Code. Das Progressform ist ein einfaches Windows.Forms.Form mit einem Label und einer Bar.

using System;
using System.IO;
using System.Collections;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;
using NEROLib;

namespace CDServices_NET
{
	public delegate void OnProgressDelegate (int ProgressInPercent, string phase);
	
	public class CDService: System.Windows.Forms.Form
	{
		#region Attributes
		private NeroClass nClass;
		private NeroFolder nRootFolder;
		private NeroDrive nDrive;
		private NeroDrives nDrives;
		private NeroISOTrack nISOTrack;
		private string artist = "";
		private string title = "";
		private string imageTarget = @"c:\image.iso";
		private NERO_MEDIA_TYPE nType = 0;
		private int burningSpeed;
		private bool longOperation = false;
		private string phase = "";
		private ProgressForm myProgressForm = new ProgressForm();
		# endregion

		#region Events
		public event OnProgressDelegate OnNeroProgress;
		#endregion
		
		# region Properties
		public string Artist 
		{
			get 
			{
				return artist;
			}
			set 
			{
				artist = value;
			}
		}

		public string Title 
		{
			get 
			{
				return title;
			}
			set 
			{
				title = value;
			}
		}

		public string ImageTarget 
		{
			get 
			{
				return imageTarget;
			}
			set 
			{
				imageTarget = @value;
			}
		}
		# endregion

		#region Contructors
		public CDService()
		{
			nClass = new NeroClass();
			nRootFolder = new NeroFolderClass();
			nISOTrack = new NeroISOTrackClass();			
		}
		#endregion
		
		# region static Methods
		public static void StaticBurn( string title, string imageTarget, string path, string recorder, int burningSpeed, string mediaType)
		{
			NERO_MEDIA_TYPE nType = (NERO_MEDIA_TYPE) Enum.Parse(typeof(NERO_MEDIA_TYPE), mediaType, true);
			CDService cd = new CDService();
			cd.SelectRecoder(recorder);	
			cd.ImageTarget = imageTarget;
			cd.Title = title;
			cd.AddAllToFolderRecursive(new DirectoryInfo(@path));		
			cd.nISOTrack.Name = cd.Title;
			cd.Burn(burningSpeed, nType);
		}

		public static void StaticBurn( string title, string path, string recorder, int burningSpeed, string mediaType)
		{
			StaticBurn (title, @"c:\image.iso", path, recorder, burningSpeed, mediaType);			
		}
		# endregion

		#region Methods		
		
		public void Burn ( string title, string imageTarget, string path, string recorder, int burningSpeed, string mediaType)
		{
			Title = title;
			ImageTarget = imageTarget;
			AddAllToFolderRecursive(new DirectoryInfo(@path));	
			SelectRecoder(recorder);
			Burn(burningSpeed);
		}

		public void Burn(int burningSpeed)
		{
			Burn(burningSpeed, NERO_MEDIA_TYPE.NERO_MEDIA_NONE);
		}

		public void Burn(int speed, NERO_MEDIA_TYPE mediaType)
		{		
			if (nDrive == null)
				throw new Exception("no recorder selected");
			myProgressForm.totalNumber = 100;
			myProgressForm.Show();
			nISOTrack.RootFolder = nRootFolder;
			burningSpeed = speed;
			nType = mediaType;
			
			
			longOperation = true;
			nDrive.EstimateTrackSize(nISOTrack, NERO_ESTIMATE_FLAGS.NETS_DATA, null);
			
			
			//adding handler	
			nDrive.OnDoneBurn += new _INeroDriveEvents_OnDoneBurnEventHandler(OnDoneBurn);
			nDrive.OnProgress += new _INeroDriveEvents_OnProgressEventHandler(OnProgress);
			nDrive.OnDoneWaitForMedia += new _INeroDriveEvents_OnDoneWaitForMediaEventHandler(nDrive_OnDoneWaitForMedia);
			nDrive.OnAddLogLine += new _INeroDriveEvents_OnAddLogLineEventHandler(nDrive_OnAddLogLine);
			nDrive.OnSetPhase += new _INeroDriveEvents_OnSetPhaseEventHandler(nDrive_OnSetPhase);
			nDrive.OnAborted += new _INeroDriveEvents_OnAbortedEventHandler(nDrive_OnAborted);
			nDrive.OnDoneCDInfo +=new _INeroDriveEvents_OnDoneCDInfoEventHandler(nDrive_OnDoneCDInfo);
			nDrive.OnDoneEstimateTrackSize +=new _INeroDriveEvents_OnDoneEstimateTrackSizeEventHandler(nDrive_OnDoneEstimateTrackSize);
			nDrive.OnDoneImport += new _INeroDriveEvents_OnDoneImportEventHandler(nDrive_OnDoneImport);
			
			nClass.OnFileSelImage += new _INeroEvents_OnFileSelImageEventHandler(OnFileSelImage);
			nClass.OnMegaFatal += new _INeroEvents_OnMegaFatalEventHandler(nClass_OnMegaFatal);
			nClass.OnNonEmptyCDRW += new _INeroEvents_OnNonEmptyCDRWEventHandler(nClass_OnNonEmptyCDRW);
			nClass.OnWaitCD += new _INeroEvents_OnWaitCDEventHandler(nClass_OnWaitCD);
			nClass.OnWaitCDMediaInfo += new _INeroEvents_OnWaitCDMediaInfoEventHandler(nClass_OnWaitCDMediaInfo);
			nClass.OnWaitCDReminder += new _INeroEvents_OnWaitCDReminderEventHandler(nClass_OnWaitCDReminder);
			nClass.OnWaitCDDone += new _INeroEvents_OnWaitCDDoneEventHandler(nClass_OnWaitCDDone);
			nClass.OnDriveStatusChanged +=new _INeroEvents_OnDriveStatusChangedEventHandler(nClass_OnDriveStatusChanged);
			
			
			while(longOperation == true)
			{
				Thread.Sleep(500);
				Console.WriteLine("locked");
			}
			longOperation = true;											
			
			nDrive.BurnIsoAudioCD(Artist, Title, false, nISOTrack, null, null, NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, 
				burningSpeed, nType); 

			while(longOperation == true)
			{
				Thread.Sleep(500);
				Console.WriteLine("locked");
			}
			
		
		}

		private ArrayList GetRecoderList(NERO_MEDIA_TYPE property)
		{
			nType = property;
			ArrayList al = new ArrayList();
			
			nDrives = (NeroDrives)nClass.GetDrives(property);
			
			foreach(NeroDrive nd in nDrives)
			{				
				al.Add(nd.DeviceName);				
			}
			return al;
		}

		public void SelectRecoder(string recoderName)
		{
			nDrives = (NeroDrivesClass)nClass.GetDrives(nType);					
			foreach(NeroDrive nd in nDrives)
			{				
				if (nd.DeviceName == recoderName)
				{
					nDrive = nd;
					return;
				}
			}
			
			throw new Exception("cannot find selected target with Name: " + recoderName);
		}

		public void SelectRecoder(int  recoderID)
		{
			foreach(NeroDrive nd in nDrives)
			{				
				if (nd.DeviceID == recoderID)
				{
					nDrive = nd;
					return;
				}
			}
			throw new Exception("cannot find selected target with ID: " + recoderID);
		}

		public void AddAllToFolderRecursive(DirectoryInfo rootDir)
		{
			AddAllToFolderRecursive(nRootFolder, rootDir);
		}

		private void AddAllToFolderRecursive( NeroFolder rootFolder, DirectoryInfo rootDir)
		{
			foreach (FileInfo fi in rootDir.GetFiles())
			{
				NeroFile newFile = new NeroFileClass();
				newFile.Name = fi.Name;
				newFile.SourceFilePath = fi.FullName;
				rootFolder.Files.Add(newFile);
			}
			foreach (DirectoryInfo di in rootDir.GetDirectories())
			{
				NeroFolder newFolder = new NeroFolderClass();
				newFolder.Name = di.Name;
				rootFolder.Folders.Add(newFolder); 
				AddAllToFolderRecursive(newFolder, di);
			}
				
		}	
		
		
		//Here we present the user with the results of the burn process
		private void OnDoneBurn(ref NERO_BURN_ERROR statusCode)
		{
			longOperation = false;
			if (statusCode != NERO_BURN_ERROR.NERO_BURN_OK)
				Console.WriteLine("OnDoneBurn: NOT successful! " + statusCode + " " + nClass.ErrorLog.ToString() + nClass.LastError.ToString());			
			else
				Console.WriteLine("OnDoneBurn: successful! " + statusCode);
		
		}

		//Here we just want to display the text that NeroCOM offers us whenever a line is
		//added to the log.
		private void nDrive_OnAddLogLine(ref NERO_TEXT_TYPE TextType, ref string Text)
		{
			Console.WriteLine("nDrive_OnAddLogLine: " + TextType + " : " + Text);
		}

		//OnAborted queries whether an operation shall be aborted. We always return
		//false; if we choose to abort, we will explicitly call the Nero object’s abort method.
		private void nDrive_OnAborted(ref bool Abort)
		{
			Abort = false;			
		}

		//progress reports from NeroCOM.
		private void OnProgress(ref int ProgressInPercent, ref bool Abort)
		{
			Abort = false;
			if (OnNeroProgress != null)
				OnNeroProgress(ProgressInPercent, this.phase);

			Console.WriteLine("OnProgress: " + ProgressInPercent);
			myProgressForm.currentNumber = ProgressInPercent;
			//myProgressForm.Invalidate();
		}
		
		//This event will be called when Nero has stopped waiting for the media.
		private void nDrive_OnDoneWaitForMedia(ref bool Success)
		{			
			Console.WriteLine("nDrive_OnDoneWaitForMedia: ");
		}

		//finding out about the current phase NeroCOM is in –
		//writing data, writing lead-in or lead-out parts of the CD-ROM and related information.
		private void nDrive_OnSetPhase(ref string Text)
		{
			this.phase = Text;
			Console.WriteLine("nDrive_OnSetPhase: " + Text);
		}
	

		//This handler is called when a very critical error occurs.
		private void nClass_OnMegaFatal()
		{
			Console.WriteLine("nClass_OnMegaFatal: " + "A mega fatal error has occurred.");
		}

		//If the user decides to use the virtual device and not a real device more
		//information is needed. The data that NeroCOM creates will be written to an
		//image file. To provide the location of that file we need to handle this event.
		private void OnFileSelImage(ref string target)
		{			
			target = ImageTarget;	
			Console.WriteLine("OnFileSelImage: " + target);
		}

		//This event will be called whenever the user tries to write on a non-empty CD-RW.
		//We merely return NERO_RETURN_EXIT, although of course more sophisticated
		//ways of handling this message are possible, e.g. by asking the user if he wants to
		//erase the CD-RW.
		private void nClass_OnNonEmptyCDRW(ref NERO_RESPONSE Response)
		{
			Response = NERO_RESPONSE.NERO_RETURN_EXIT;
			Console.WriteLine("nClass_OnNonEmptyCDRW: NERO_RETURN_EXIT");
		}

		//This event will be called when Nero is waiting for a CD to be inserted into the
		//drive.
		private void nClass_OnWaitCD(ref NERO_WAITCD_TYPE WaitCD, ref string WaitCDLocalizedText)
		{
			Console.WriteLine("nClass_OnWaitCD: " + WaitCDLocalizedText);
		}

		//This event will be fired when Nero is waiting for a particular type of media.
		private void nClass_OnWaitCDMediaInfo(ref NERO_MEDIA_TYPE LastDetectedMedia, ref string LastDetectedMediaName, ref NERO_MEDIA_TYPE RequestedMedia, ref string RequestedMediaName)
		{
			Console.WriteLine("nClass_OnWaitCDMediaInfo: Waiting for a particular media type: " + RequestedMediaName);
		}

		//This event will occur when Nero has been waiting for the insertion of a CD for
		//quite a while.
		private void nClass_OnWaitCDReminder()
		{
			Console.WriteLine("nClass_OnWaitCDReminder: Waiting for CD");
		}
		#endregion

		private void nDrive_OnDoneCDInfo(INeroCDInfo pCDInfo)
		{
			Console.WriteLine("nDrive_OnDoneCDInfo: " + pCDInfo.ToString());
		}

		private void nDrive_OnDoneEstimateTrackSize(bool bOk, int BlockSize)
		{
			longOperation = false;	
			Console.WriteLine("nDrive_OnDoneEstimateTrackSize: " + bOk + "Blocksize: " + BlockSize);
				
		}

		private void nDrive_OnDoneImport(ref bool Ok, ref NeroFolder Folder, ref NeroCDStamp CDStamp)
		{
			Console.WriteLine("nDrive_OnDoneImport: " + Ok + Folder.ToString() + CDStamp);
		}

		private void nClass_OnWaitCDDone()
		{
			Console.WriteLine("nClass_OnWaitCDDone");
		}

		private void nClass_OnDriveStatusChanged(int hostID, int targetID, NERO_DRIVECHANGE_RESULT driveStatus)
		{
			Console.WriteLine("nClass_OnDriveStatusChanged: hostID:" + hostID + " targetID:" + targetID + " " + driveStatus);
		}
	}

}
Y
220 Beiträge seit 2004
vor 19 Jahren
Danke!

Hallo,

menno selber wrappen! Das auch noch 😉

Vielen Dank,

Yahoo

G
18 Beiträge seit 2004
vor 19 Jahren

jaha! schaffst Du schon 😉
hab den wrapper gleich strong named signiert und in den GAC eingetragen.
Wollte vorhin eigentlich noch den Code etwas erklaeren, aber es musste schnell gehen, weil ich erstmal essen gegangen bin 🙂
In der OnProgress (Z. 265) ist ein Aufruf der das ProgressForm mit einem neuen Wert updated - genau dieses laesst mein Programm in die Endlosschleife laufen (im Gegensatz wie ich vorhinbehauptet habe, die Instanz alleine reicht aus)
Ausserdem funktion das Progressfensterchen noch nicht wirklich - es wird nur einmal am Anfang gezeichnet und sonst nie (-> weiss, wenn ichs verschieb). Vermutlich ist da auch noch ein Design(denk)fehler. Soll das Fenster in einen eigenen Thread?

G
18 Beiträge seit 2004
vor 19 Jahren

also wenn ich den ProgressDialog nach dem BurnIsoAudio-aufruf modal aufrufe:
myProgressForm.ShowDialog();
dann funktionierts fast so ich mir es vorgestellt habe. Leider kann ich fuer die Zeit vor dem Brennaufruf keine Statusinformationen liefern, d.h. waehrend der erste While-schleife. Habe es nicht geschaft, da ein Fenster aufzumachen (darf nicht modal sein!) das auch funktioniert. Events wirft NeroCom da leider auch noch nicht...
anbei mal ein Bildchen wies momentan aussieht.

G
205 Beiträge seit 2003
vor 19 Jahren

@Gumble
Könntest du mir dein Testprojekt mal zukommen lassen???
Die Progressbar ging nämlich beim Tutorial ohne probleme mit.

G
18 Beiträge seit 2004
vor 19 Jahren

@guenni81
danke fuer die muehen, aber so wie es laeuft reichts mir erstmal. ist ja eh nur ne komponente zum testen. haette halt gern mehr details ueber nerocom@.net gehabt, aber die informationen sind ja sehr spaerlich. ein (vollstaendiges) uml-ablaufdiagramm waer fein - sowas wie 'select recoder', 'add files', 'add dir', 'EstimateTrackSize'. 'burn' usw und das alles in einem zeitlichen zusammenhang bringen...

G
205 Beiträge seit 2003
vor 19 Jahren

@Gumble
OK, wenn es dir soweit reicht wie du es hast passt es ja ;o)
Aber so ne komplette Libary die die Neroschnittstelle wrappt wäre doch wirklich was sehr feines.

G
18 Beiträge seit 2004
vor 19 Jahren

Hier nochmal fuer den geneigten NERO user meine bisherige kleine Komponente 🙂
Anregungen, Verbesserungen und Wuensche gerne aeussern. Vielleicht will ja einer da weiterbasteln - dann koennte man das in die Komponentensammlung aufnehmen.
Was noch geandert werden muss, ist nur noch den 'Trace.Debug' Befehl durch eigene Tracings (oder Console.Write) zu ersetzen.

[Inhalt wrappednero.zip]
CDService_NET.cs
Progress.cs
ColorProgressBar.dll

V
45 Beiträge seit 2004
vor 19 Jahren
DLL einbinden

ich habe leider ein Problem mit der Einbindung der DLL in SharpDevelop. Ich denke dass es mehr daran liegt dass ich nicht genau weiß wie es geht. Ich habe die DLL nach der Anleitung dissambliert, bearbeitet und abschließend in die nerolib.dll zurück"-gewandelt". Ich kann die DLL aber nicht in die using-Klausel einbinden. Ich habe die DLL in das Projekt-Verzeichniss kopiert (was wohl falsch ist).
Wie binde ich die DLL richtig ein?

G
205 Beiträge seit 2003
vor 19 Jahren

Wie man eine DLL Datei bei SharpDevelop hinzufügt kann ich dir leider nicht beantworten, habe noch nie damit gearbeitet.

1.549 Beiträge seit 2004
vor 19 Jahren

Wie man eine DLL Datei bei SharpDevelop hinzufügt kann ich dir leider nicht beantworten, habe noch nie damit gearbeitet.

wird ihm ja viel nützen

du must in derProjektmape rechtsklick auf das Projekt und Reverrenz hinzufügen

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

V
45 Beiträge seit 2004
vor 19 Jahren

Ah, jetzt funktioniert das Brennen 🙂 Vielen Dank

vel

G
205 Beiträge seit 2003
vor 19 Jahren

Mich freut es aber das dieses dennoch kleine Tutorial so beliebt ist und den vielen leute behilflich sein kann

V
45 Beiträge seit 2004
vor 19 Jahren

Es ist nunmal um einiges schlanker als die Nero-Docs 😁

vel

D
1 Beiträge seit 2005
vor 19 Jahren

Hallo,

bin neu in diesem Forum. Habe das erwähnte Beispielprogramm bereits im Einsatz.

Frage:
Wie kann ich eine Multisession-CD/DVD erstellen?
Welche Option / welcher Befehl ist dazu notwendig?

Vielen Dank.

Gruß
dandy001

T
41 Beiträge seit 2004
vor 19 Jahren

Hallo.

Erstmal vorweg....super tutorial. Hab die Vorgehensweise gleich angewant und hat sofort geklappt.
Nur hab ich jetzt folgendes Problem bei Audio CDs.

Ich habe folgenden Code:

private void BURN_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
		{
			if(e.KeyCode == Keys.Space && this.chosenDrive.DeviceReady == true)
			{
				if(this.label1.Text == "AUDIO")
				{
					int i = 0;

					foreach(object path in files2burn)
					{
						NEROLib.NeroAudioTrack ntrack = new NEROLib.NeroAudioTrack();
						FileInfo file = new FileInfo(path.ToString());

						ntrack.Title = file.Name;
						ntrack.Filename = file.FullName;

						
						this.audioTracks.Add(ntrack);
						
						this.chosenDrive.OnDoneBurn += new NEROLib._INeroDriveEvents_OnDoneBurnEventHandler(this.Burner_OnDoneBurn);
						this.chosenDrive.OnProgress += new NEROLib._INeroDriveEvents_OnProgressEventHandler(this.Burner_OnProgress);
						
						while(longOperation == true)
						{
							Thread.Sleep(500);
							MessageBox.Show("locked");
						}

						
						this.chosenDrive.BurnIsoAudioCD("MEDIACENTER", "COLLECTION", false, null, this.audioTracks, null, NEROLib.NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, 10, NEROLib.NERO_MEDIA_TYPE.NERO_MEDIA_CDR);
				
					}
				}

Nun krieg ich immer diese (wie schon am Anfang erwähnte) COMException wegen den asynchronen Operationen. Auch das einbinden von Thread.Sleep() hat nicht geholfen.

Wisst ihr da weiter? Welche andere Operation soll das sein?

mfg
tom

142 Beiträge seit 2004
vor 19 Jahren

Hallo zusammen!
Hab das Projekt mal ausprobiert, funktioniert einwandfrei. Großes lob an den Ersteller.

Hab aber noch ne Frage!
Geht das auch ohne das Nero installiert ist? Wenn ich Nero wieder deinstalliere, kommt ne fehlermeldung.

Aber ehrlich, is ein super Projekt. Es nervt nur das dazu Nero installiert sein muss, und nicht die nerolib.dll allein reicht!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

@GIJOE
Nein, NERO mußt du vorher auf dem Rechner installiert haben. Die NEROLib ist glaube ich eher zum automatisieren gedacht. Nach dem Motto: "Da liegen die Daten, brenne sie mir!". 😉

@turndevil
Nach deiner while-Schleife wird nichts passieren, da kannst du Jahre mit verbringen! 😁



while(longOperation == true)
{
  Thread.Sleep(500);
  MessageBox.Show("locked");
}

this.chosenDrive.BurnIsoAudioCD("MEDIACENTER", "COLLECTION", false, null, 
  this.audioTracks, null, NEROLib.NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, 
  10, NEROLib.NERO_MEDIA_TYPE.NERO_MEDIA_CDR);

Überleg' mal, BurnIsoAudioCD() startest du doch erst danach und jetzt können auch erst die Events ausgelöst werden!
Habe auch ganz schön an deiner Fehlermeldung herumgebastelt und die Lösung liegt darin, daß du alle Events, die BurnIsoAudioCD() auslösen kann mit einbinden und dir in einer TextBox ausgeben solltest. Dann weißt du auch, was die NEROLib von dir will.

Warscheinlich wirst du in deiner foreach()-Schleife nicht mehrmals hintereinander BurnIsoAudioCD() aufrufen können, da NERO maximal eine CD brennen kann. 😉

142 Beiträge seit 2004
vor 19 Jahren

Hallo Scrapy!

Wenn ich Nero wieder Deinstalliere und einige DLL´s unt eine txt Datei im Ordner belasse. Und dazu die NeroCom.dll wieder neu registriere kann ich weiter brennen.

Es muss doch möglich sein, anhand der von Nero Kopierten Dateien und Registry Einträge auch ohne einer Installation von Nero zu brennen?

Was ich damit meine ist, man schaut erst was Nero bei der Installation für Dateien Kopiert, was für Registry Einträge gemacht werden. Dann Kopiert man diese Dateien auf die seite, Exportiert die Registry Einträge. Auf einem neuen System kopiert man die Dateien in die dafür vorgesehenen Verzeichnisse, und fügt die Registry Einträge wieder zusammen. Das müßte doch funktionieren oder?

Was für Registry Einträge Nero macht hab ich schon herausgefunden, aber was für Dateien Nero wo hin spielt kann ich nicht nachvollziehen!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

1.457 Beiträge seit 2004
vor 19 Jahren

Aus welchem Grund sollte das ganze gut sein?

Im Enddefekt benutzt du ja Nero zum brennen und keine selbsgeschriebene Engine. Desweiteren darfst du die "Engine" auch nur benutzen wenn du das Produkt Nero installiert hast.

Falls dir das nicht gefällt, dann musst du meines erachtens nach etwas anderem suchen und nicht die Nero API benutzen.

Falls du natürlich nicht möchtest das der Benutzer dann mit Nero brennt, sondern nur mit deinem Programm, dann kannst du ja die Verknüpfungen entfernen.

142 Beiträge seit 2004
vor 19 Jahren

Hallo burning snow!

Du hast schon recht!
Der ganze Aufwand?

Es ist ja nur, weil ich wie du schon sagtest, die Nero Software nicht auf dem User PC installieren möchte!

Und ich mit meinem Wissenstand, im Moment nicht in der Lage bin, eine 100% eigene Brenner-Software zu schreiben!

Aber Danke, vieleicht gibt es ja irgend wann eine andere Möglichkeit!

Diese Nero möglichkeit ist natürlich eine sehr gute Alternative.

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

142 Beiträge seit 2004
vor 19 Jahren

Hallo Gumble!

Würde es dir was ausmachen mir dein Projekt zurferfügung zu stellen?
Ich komme mit meinem Brenner Projekt einfach nicht weiter!

Ich wär dir sehr dankbar!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

Ich glaub' in diesem Tread wäre jeder an einem Quellcode interessiert! 🙂

Würd' mal übrigens gerne wissen, wie ihr die Daten brennen könnt, ohne eine MessageBox vor und nach dem Brennvorgang zu setzen?
Ich denke, es liegt nicht direkt an der MessageBox, denn ich könnten schwören das es vorher auch ohne funktioniert hat!
Deswegen frag' ich - ob einer auch dieses Phänomen und seine Lösung dazu kennt. 🙁

142 Beiträge seit 2004
vor 19 Jahren
CD Informationen

Hallo zusammen!

Weis vieleicht von euch jemand wie ich die Informationen der momentan eingelegten CD über eine Nero Funktion herausfinden kann?

z.B. CD Typ(CDRW, CDR, CDROM usw),die Größe der CD, bespielt oder nicht usw.

Hab es über die NeroCDInfoClasse schon versucht, aber ich bekomm das einfach nicht hin.

Bin für jeden Tip dankbar!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

@GIJOE:
Gegenfrage: Wozu brauchst du die Informationen? Vielleicht kann ich dir dann weiter helfen.

142 Beiträge seit 2004
vor 19 Jahren

Hallo Scrapy!

  1. Wenn ich z.B eine MP3 Disk erstellen möchte, und dann z.B. 701 MB zusammen habe. Möchte ich gerne, wenn der User auf Brennen geht, dass das Prog. ihm sagt: "Halt mein Freund, du hast nur eine 700 MB Disk im Laufwerk. Da muß entweder ein File weg, oder eine größere Disk rein!".

  2. Wenn der User eine CD Brennen möchte, und eine CDRW im L. ligt die schon bespielt ist. Möchte ich ihm gerne sagen: "Du hast eine CDRW im L., möchtest du diese erst löschen oder den Brennvorgang abbrechen?".

Es sind halt allgemeine Informationen die ich gerne auslesen möchte!

Danke im Voraus für deine Hilfe!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

@GIJOE:
Zu 1.: Hab ich momentan auch noch keine Lösung, denn die Größe kann man nicht wie die Maximale Kapazität einer Festplatte ablesen. 🙁

Zu 2.: Das kann man glaube ich über das aktuelle Nero-Laufwerk (mittels: NeroDrive) und NERO_MEDIA_TYPE.[...] abfragen.
Beim Löschen checke ich einfach ob Daten, in Form von Dateien oder Ordnern auf der Disk sind! 😉

Hast du denn schon einmal etwas gebrannt, mittels der NEROLib?

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Ich kann löschen, schreiben, die Brenngeschwindigkeiten auslesen, die Zeit anzeigen lassen wie lange er schon brennt, auf sämtliche Events reagieren. Aber wie gesagt, die scheiß Kapazitäten kann ich nicht auslesen. Übrigens, dein Vorschlag mit dem Löschen ist ne gute Alternative!
Vieleicht finden wir ja noch raus wie das geht. Nur schade das man über die NeroCom bzw. Nerolib nicht mehr in erfahrung bringen kann. Ich hab mir die Struktur im Objektbroser mal angesehen, und versuchte da mal etwas Licht hinein zu bringen. Aber ohne Erklärungen scheint das ein aussichtsloser Kampf zu werden.

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Es gibt da noch die Classe NEROLib.NeroCDInfoClass und das Interface NEROLib.INeroCDInfo. Ich kann damit nicht so richtig was anfangen, hab schon sämtliches versucht. vieleicht findest du ja was raus!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

Ja, habs mal so eben [...] ausprobiert!


private void Brennen()
{
  //neoLaufwerk wurde mit NeroDrive erstellt[...]
  
  //Nero-Event erstellen:
  this.neoLaufwerk.OnDoneCDInfo +=new _INeroDriveEvents_OnDoneCDInfoEventHandler(this.neoLaufwerk_DoneCDInfo);


  neoLaufwerk.CDInfo(NERO_CDINFO_FLAGS.NERO_READ_CD_TEXT | NERO_CDINFO_FLAGS.NERO_READ_ISRC);

  //Solange er was macht ist: bBearbeite = true (Globale Variable)
  //andernfalls wir des von den Nero-Events auf false gesetzt.
  while(bBearbeite)
  {
    Application.DoEvents();;
  }
  
  //Brennen usw. ...
}

//Das Event auswerten:
private void DoneCDInfo(INeroCDInfo neoCDInfo)
{
  MessageBox.Show("Disktyp: " + neoCDInfo.MediaType + ", Titel: " + neoCDInfo.Title)
  //jetzt kann man alles von CDInfo abfragen!
}

NeroCDInfo kannst du nur über das Event abfragen, was du vorher erstellt hast!
Hier kannst du dann den Disktyp, Schreibbarkeit, Titel, usw. ... ausgeben lassen bzw. abfragen.

Wie kannst du denn die Zeit für den Brennvorgang anzeigen lassen?
Also ich brenne momentan Daten-CD-RWs so:


NeroSpeedsClass neoGeschw = (NeroSpeedsClass)neoLaufwerk.WriteSpeeds;
iGeschw = neoGeschw.Item(neoGeschw.Count - 1); //Maximalgeschwindigkeit

neoLaufwerk.BurnIsoAudioCD("", "", false, (INeroISOTrack)neoISOTrack, null, null, 
					NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, 
					iGeschw, NERO_MEDIA_TYPE.NERO_MEDIA_CD | NERO_MEDIA_TYPE.NERO_MEDIA_DVD_ANY);

Mit DVD-RWs hab ich so meine Schwierigkeiten - obwohls die gleiche Routine ist. 😦
Zudem ist die Geschwindigkeit nicht wirklich richtig[...].

Wie machst du das? Wäre dir dankbar über deinen Code!

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Also das mit der Zeit steuer ich über die Event´s nDrive_OnAddLogLine, OnDoneBurn und einem Timer!

Wie gesagt, ich zeige hier nur die bis lang vergangene Zeit an.
Wie lange er noch brennt wird hier nicht angezeigt!


//Here we just want to display the text that NeroCOM offers us whenever a line is
//added to the log.
private void nDrive_OnAddLogLine(ref NERO_TEXT_TYPE TextType, ref string Text)
{
timer2.Start();
switch (Text)
{
case "Caching of files started":
{
textBox1.Text += "Einspielen der Daten wurde gestartet!" + Environment.NewLine;
break;
}
....
....
....
....
}
}

//Here we present the user with the results of the burn process
private void OnDoneBurn(ref NERO_BURN_ERROR statusCode)
{
timer2.Stop();
timmerk = 0;
longOperation = false;
if (statusCode != NERO_BURN_ERROR.NERO_BURN_OK)
MessageBox.Show("OnDoneBurn: NOT successful! " + statusCode + " " + neroclass.ErrorLog.ToString() + neroclass.LastError.ToString());            
else
MessageBox.Show("OnDoneBurn: successful! " + statusCode);
}
	
private int timmerk = 0;
private TimeSpan ts;
private void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timmerk += 10000000;
ts = new TimeSpan(timmerk);
label5.Text = "Verstrichene Zeit " + ts.ToString();
}

Die Brenngeschwindigkeiten des momentan verwendeten Medium lese ich wie folgt aus!

				for (int i = ndrive.get_AvailableSpeeds(NEROLib.NERO_ACCESSTYPE.NERO_ACCESSTYPE_WRITE, NEROLib.NERO_MEDIA_TYPE.NERO_MEDIA_CDRW).Count -1; i >= 0 ; i--)

Was mich jetzt noch interessieren würde, du konkartinierst zwei enum Objekte zusammen? Oder wie ist das mit dem "|" zu verstehen? Das seh ich so oft, und kann nix damit anfangen! was passiert da wenn man das macht?

  neoLaufwerk.CDInfo(NERO_CDINFO_FLAGS.NERO_READ_CD_TEXT | NERO_CDINFO_FLAGS.NERO_READ_ISRC);

oder

NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, 
                    iGeschw, NERO_MEDIA_TYPE.NERO_MEDIA_CD | NERO_MEDIA_TYPE.NERO_MEDIA_DVD_ANY); 

Muss mir jetzt mal dein Beispiel auf der Zunge zergehen lassen!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

@GIJOE
Ich Konkarti... was? 😉

Nein, ich weiss schon was du meinst, das: | (Logisches Oder).
Ein kleines Rechenbeispiel der Logik:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Das ganze gibts natürlich auch mit: & (Logisches Und).
Wieder ein kleines Rechenbeispiel:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Gleiches gilt bei || (Oder beim Vergleich) bzw. && (Und beim Vergleich).
So kann man die logischen Werte (bitweise) zusammenziehen!
Dieses: "NERO_MEDIA_TYPE.NERO_MEDIA_CD" ist eben nur ein Bitmuster, ein: Flag.
Wenn du mehrere zusammen haben möchtest, kannst die Sie durch ein & bzw. | nach der oben angegebenen Rechnung kombinieren.

Beim meinem Brennvorgang z.B.:


neoLaufwerk.BurnIsoAudioCD("", "", false, (INeroISOTrack)neoISOTrack, null, null, NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, iGeschw, NERO_MEDIA_TYPE.NERO_MEDIA_CD | NERO_MEDIA_TYPE.NERO_MEDIA_DVD_ANY); 

kannst nicht nur CD-R/Ws brennen sonder auch alle DVD-+R/Ws, weil die Flags über ein Oder (1 | 1 = 1) verknüpft sind!

(Tut mir leid, aber sowas kann ich nicht wirklich gut erklären - war ein Versuch!)

Sag mal wie brennst du eigentlich DVD's? Bei mir geht das mal und mal nicht! Wie gesagt ich mach das ja auch nur über den oben genannten Aufruf! 😦

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Hast du sehr schön erklärt!

Hab das in der Schule gehabt, eigentlich hätte ich das wissen müssen.
Aber man vergißt halt vieles mit der Zeit!

Ich brenne keine DVD´s, hab leider noch keinen DVD Brenner.

Dein Beispiel mit den Medium Infos funktioniert, aber da hätte ich noch ne Frage!

Die freie Speichergröße wird in Blöcken angegeben. wie wird das umgerechnet?

Und woher wustest du das der Methodenaufruf eine "&&,|| oder |" entgegen nimmt?

Und "|" = xor, "||" = oder, "&&" = und, lieg ich da richtig?

Hat Dir meine Geschwindigkeitsausleserei was gebracht?

Gruss, GIJOE?

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

@GIJOE
Das Wissen hat man sich eben über die Jahre angeeignet - aber wie du siehst weiß ich immer noch nicht alles - leider bekommt man dafür keine Ausbildung.
Man muß aktiv dran bleiben! 😉

Die Bitweise Verknüpfung mit den Flags kannst du mit allen Enummerationen (enum in C#) machen! Vielleicht ergeben aber nicht alle Verknüpfungen ein Sinn, das liegt dann aber an dem, der das programmiert hat. 8)

Für das Umrechnen von Blöcken in Byte hab ich leider keine Formel.
Aber wenn die Disk leer ist, hast du die maximale Anzahl an Blöcken von der Disk aus CDInfo. Wenn du dann die EstimateTrackSize davon abziehst und einen Wert größer als Null raus gekommst, dann ist die Disk noch nicht voll! (Theoretisch, denke ich.)

Nein, also && bzw. || aber auch == kannst du in C# nur bei Vergleichen benutzen, sonst nicht!
Die Bitweise Verknüpfung kannst nur bei Flags (enum in C#) - also wenn du was bitweise Verknüpfen möchstest verwenden! Bitweise könntest du auch mit einem = vergleichen.
Nochmal zur Überischt:
| - Bitweises ODER
& - Bitweises UND
^ - Bitweises XOR
= - Bitweises ISTGLEICH
|| - Vergleichs ODER
&& - Verlgeichs UND
== - Vergleichs ISTGLEICH

Also ich weiß nicht, das mit den Geschwindigkeiten haut irgendwie nicht ganz hin.
Hab das bei mir mit:


NeroSpeedsClass neoGeschw = (NeroSpeedsClass)neoLaufwerk.WriteSpeeds;

gemacht aber da bekommt man meist utopisch hohe Werte und bei dir sehr kleine!
Frag' nicht was richtig ist!? Die CD/DVDs die ich eingelegt habe, hatten z.T. ganz andere Geschwindigkeiten angegeben!
Beide Methoden klingen irgendwie richtig, geben jedoch völlig andere Werte aus!

Probier's mal aus 🤔

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Erstmal danke für deinen nachhilfe Untericht!

Also!
Ich habe deine als auch meine Version mal ausprobiert, diese Werte habe ich mit dem Origianl Nero Prog. verglichen. Dabei rausgekommen ist, die Werte von mir und die Werte von Nero sind identisch!

Bei mir bringt er bei einem "normalen" Roling die Werte:
4
8
16
24
Und bei einer CDRW:
4

Im Vergleich zu Nero, absolut identisch!

Ich hab das auch bei meinem anderen Rechner versucht, da ist ein schnellerer Brenner drin.

Bei mir bringt er bei einem "normalen" Roling die Werte:
4
8
16
24
48
Und bei einer CDRW:
2
4

Das hier die Werte im bereich CDRW als 2 und 4 angezeigt werden, liegt warscheinlich am Laufwerk.
Denn wenn ich in das obere zwei verschiedene CDRW Marken einlege, zeigt er mir jeweils 4 an.
Bei meinem anderen Rechner zeigt er mir bei dem einen Roling 2 und 4, und bei dem anderen 2 an. Das kann nur am Laufwerk liegen, denn Neror zeigt das aller gleiche an.

Dabei wird es warscheinlich noch mit eine Rolle spielen ob die CDRW schnell oder langsam gelöscht wurde!

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

Okay, dann ist deine Methode wohl die richtige.
Ich hab' nur eine CD-RW auf der zwar 16-24x drauf steht, die er aber nur mit 2x angibt.

Wo hast du eigentlich deine ganzen Nero-Informationen her? Auch selbst erarbeitet nach dem Motto: Try&Error?

142 Beiträge seit 2004
vor 19 Jahren

Hi @Scrapy

Mühsam ernährt sich das Eichhörnchen!

Ja, ich versuch mir den ganzen Scheiß so gut wie möglich selber bei zu bringen, alerdings sind viele Nero Infos aus dem Forum.

Hab mir von .Net drei Bücher gekauft (c#.Net, c#.net Kochbuch und ADO.Net) aber das sind halt alles nur Grundlagen.

Momentan versuche ich das Interface zu verstehen, aber das ist schon ein hater Kampf!

Übrigens mit dem Event Mühsam ernährt sich das Eichhörnchen "ndrive_OnSubTaskProgress" kanst du den verwendeten Lesepuffer abfangen. Aber das hast bestimmt schon gewust! Der geht max bis 100 wenn viel zum brennen ist.

		private void ndrive_OnSubTaskProgress(ref int ProgressInPercent, ref bool Abort)
		{
			label9.Text = ProgressInPercent + "%";
			progressBar1.Value = ProgressInPercent;
		}

Was mir bei aufgefallen ist. Egal was für einen Speed ich ihm übergebe z.B. 8x, sagt er "Can only write at 24x (3.600 KB/s) instead of 1200x (180.000 KB/s) to current disc." und bringt dann "Simulation started at 24x (3.600 KB/s)". Die Sau schreibt immer mit der Max Geschwindigkeit!

Hast du dafür vieleicht eine Lösung? =)

Gruss, GIJOE

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

142 Beiträge seit 2004
vor 19 Jahren

@Scrapy

Übrigens meine CDRW sind auch Multispeed fähig. Weis Gott was die unter MultiSpeed verstehen!

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

Ja, also in Sachen Büchern hab' ich auch eine Menge[...] deswegen fühle ich mich jetzt auch nicht unbedingt intelligenter!

Á propos Lesepuffer:
Mein Laufwerk unterstütz BurnProof, auch unter NERO-Burning-ROM. Aber wenn ich das bei den Brennoptionen mit einstelle, bekomme ich eine Fehlermeldung, daß das mein Laufwerk nicht unterstützt. 🙁

Zu deiner Brenngeschwindigkeit nochmal:

Was mir bei aufgefallen ist. Egal was für einen Speed ich ihm übergebe z.B. 8x, sagt er "Can only write at 24x (3.600 KB/s) instead of 1200x (180.000 KB/s) to current disc." und bringt dann "Simulation started at 24x (3.600 KB/s)". Die Sau schreibt immer mit der Max Geschwindigkeit!

Lies mal was da steht: Kann nur 24x (3.600 KB/s) anstellte von 1200x (180.000 KB/s) schreiben!
Oder hast du dich da jetzt verschrieben? 🤔

Ich glaube so schnell schaffts noch kein Brenner - vielleicht hast du da einen kleinen Bug drinne. Aber gut das er es bei dir mit maximaler Geschwindigkeit schreibt, meiner Macht das ja nur mit Minimaler. 😭

142 Beiträge seit 2004
vor 19 Jahren

Hallo @Scrapy!

Das war ein Bug, hatte statt die Brenngeschwindigkeit die Kb übergeben!
Sehr dümmlich! 🤔

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

S
12 Beiträge seit 2004
vor 19 Jahren

Hab's jetzt mit dem DVD-Brennen hinbekommen!

Man darf das nicht so, wie ich das gemacht habe, mixen (mit dem oben besprochenen: " | ")!


neoLaufwerk.BurnIsoAudioCD("", "", false, (INeroISOTrack)neoISOTrack, null, null, NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, iGeschw, NERO_MEDIA_TYPE.NERO_MEDIA_CD | NERO_MEDIA_TYPE.NERO_MEDIA_DVD_ANY); 

Sonder nur das Flag auswählen, was für den aktuellen Brennvorgang wichtig ist:


//Globale Variable:
private NERO_MEDIA_TYPE neoMedium;

//...jenachdem den Typ setzen:
// z.B.: für eine CD-RW:
neoMedium = NERO_MEDIA_TYPE.NERO_MEDIA_CDRW;
// oder eine DVD+RW:
neoMedium = NERO_MEDIA_TYPE.NERO_MEDIA_DVD_P_RW;
//...

private void Brennen()
{
 neoLaufwerk.BurnIsoAudioCD("", "", false, (INeroISOTrack)neoISOTrack, null, null, NERO_BURN_FLAGS.NERO_BURN_FLAG_WRITE, iGeschw, neoMedium); 
}

@GIJOE:
Aus deiner Methode bekommt man aber nur die KB/s! Das könnte man aber umrechnen, wenn man wüßte, wieviel KB/s's eine CD bzw. DVD mit einfacher Geschwindigkeit übertragen. 😉

142 Beiträge seit 2004
vor 19 Jahren

Hallo @Scrapy

Ich hab da mal was vesucht!
Die komplette Datengröße erfassen, und dann durch die Brenngeschwindigkeit(600kb/s) teilen.
Einen Timer laufen lassen mit einem Interval von 1000 ms, und das ergebnis dekrementieren.
Das müßte rein theoretisch funktionieren, tut es aber nicht zu 100%.

		private FileInfo FInfo;
		private long FileSize = 0;				//Gesamte Datengröße feststellen
				FInfo = new FileInfo(@"c:\.....");
				FileSize += FInfo.Length / 1024; 			//Die zu brennende Zeit festlegen
			nochbrennzeit = Convert.ToInt64(Convert.ToDouble(FileSize) / speed_kb;

Gruss, GIJOE

Auch Anfänger haben recht auf Leben! 😁

69 Beiträge seit 2005
vor 19 Jahren

cool danke
nicht schlecht
Mat

J
8 Beiträge seit 2005
vor 19 Jahren

Hallo,

vielen Dank für Tutorial und Projekt. Ich bin blutiger C#-Anfänger (aber langjähriger Delphi-Programmierer) und versuche nun auf der Grundlage von Gumbles Projekt eine kleine Brennanwendung zu entwickeln, die quasi automatisch meine automatisch erstellten Backups (auf CD und/oder DVD) brennt. Dabei soll das Programm (auch) spezifische Medien anfordern, die über den Title identifiziert werden. Und genau hier liegt mein aktuelles Problem, OnDoneCDInfo liefert immer einen leeren Title. Die anderen Attribute scheinen zu stimmen. Zum Einsatz kommt die NeroCom.dll 1.3.1.2. Kann jemand das Problem bestätigen oder einen Workaround anbieten?

Danke
josch