![]() |
DelphiNeroApi - Dateien übergeben
Hallochen,
habe mich etwas intensiver mit der DelphiNeroApi auseinandergesetzt und mir dabei auch das Sample und die Demo näher angeschaut. Soweit hab ich das relativ gut verstanden. Das Einzige, was ich noch nicht entdeckt habe ist, wie ich die Dateien/Ordner, die gebrannt werden sollen, übergebe. In der Demo ist zwar eine TreeView, wo man offensichtlich per Drag&Drop Dateien draufziehen soll, aber da passiert irgendwie nix ;) Ich bin auch schon mit dem debugger durchgegangen, aber dieser Teil scheint nicht enthalten zu sein... Hat jemand Erfahrung mit der Api und kann mir da einen kleinen Tipp geben, wo ich nachschauen kann? Im Forum hier und per Google hab ich schon intensiv gesucht, aber leider nichts passendes gefunden. :( Vielen Dank, Gina. |
Re: DelphiNeroApi - Dateien übergeben
So, hier mal meine aktuelle Test-Unit, vielleicht könnt ihr mir dann besser helfen ;)
Delphi-Quellcode:
Also, irgendwie passiert nix. Er tut so, als wenn ich immer abbrechen würde. Meistens wirft er die CD aus, sagt mir aber nicht warum...
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, NeroAPI, NeroUserDialog, NeroIsoTrack, dnapiComponents, StdCtrls, Registry; type TForm1 = class(TForm) ListBoxBurn: TListBox; ListBoxSize: TListBox; Button1: TButton; Button2: TButton; dnapiSettings1: TdnapiSettings; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } NeroIsoTrack: CNeroIsoTrack; RootIsoItem: PNeroIsoItem; NeroSettings: PNeroSettings; NeroDeviceHandle: NERO_DEVICEHANDLE; NeroProgress: NERO_PROGRESS; NeroCDInfo: PNeroCDInfo; NeroWriteCD: PNeroWriteCD; NeroDeviceInfos: PNeroSCSIDeviceInfos; NeroIsoItem: PNeroIsoItem; end; var Form1: TForm1; implementation {$R *.dfm} function IdleCallback(pUserData: Pointer): Boolean; cdecl; begin Application.ProcessMessages; Result := False; end; function ProgressCallback(pUserData: Pointer; dwProgressInPercent: DWORD): BOOL; cdecl; begin Form1.ListBoxBurn.items.add(FormatFloat('000 ', dwProgressInPercent) + '%'); Application.ProcessMessages; Result := IdleCallback(pUserData); end; function AbortedCallback(pUserData: Pointer): BOOL; cdecl; begin Result := True; --> ist das richtig? end; procedure AddLogLine(pUserData: Pointer; _type: NERO_TEXT_TYPE; text: PChar); cdecl; var Header: String; begin case _type of NERO_TEXT_INFO: // informative text begin MessageDlg(text, mtInformation, [mbOK], 0); end; NERO_TEXT_STOP: // some operation stopped prematurely begin MessageDlg(text, mtError, [mbOK], 0); header := '# '; end; NERO_TEXT_EXCLAMATION: // important information begin MessageDlg(text, mtWarning, [mbOK], 0); header := '! '; end; NERO_TEXT_QUESTION: // a question which requires an answer begin MessageDlg(text, mtConfirmation, [mbOK], 0); end; NERO_TEXT_DRIVE: // a message concerning a CD-ROM drive or recorder begin MessageDlg(text, mtInformation, [mbOK], 0); end; end; end; procedure SetPhaseCallback(pUserData: Pointer; text: PChar); cdecl; begin ShowMessage(text); end; procedure DisableAbortCallback(pUserData: Pointer; abortEnabled: BOOL); cdecl; begin if abortEnabled then ShowMessage('The current process cannot be interrupted') else ShowMessage('The process can be interrupted again'); end; procedure SetMajorPhaseCallback(pUserData: Pointer; phase: NERO_MAJOR_PHASE; reserved: PVoid); cdecl; begin case phase of NERO_PHASE_BUP_ACTIVATED: ShowMessage('BUP Activated'); NERO_PHASE_CONTINUE_FORMATTING: ShowMessage('Continue Formating'); NERO_PHASE_DONE_CACHE: ShowMessage('Done Caching'); NERO_PHASE_DONE_SIMULATE: ShowMessage('Done Simulation'); NERO_PHASE_DONE_SIMULATE_NOSPD: ShowMessage('Done Simulation - No SPD'); NERO_PHASE_DONE_TEST: ShowMessage('Done Testing'); NERO_PHASE_DONE_WRITE: ShowMessage('Done Writing'); NERO_PHASE_DONE_WRITE_NOSPD: ShowMessage('Done Writing - No SPD'); NERO_PHASE_DVDVIDEO_DETECTED: ShowMessage('DVD Video Detected'); NERO_PHASE_DVDVIDEO_REALLOC_COMPLETED: ShowMessage('DVD Video Relloc Completed'); NERO_PHASE_DVDVIDEO_REALLOC_FAILED: ShowMessage('DVD Video Realloc Failed'); NERO_PHASE_DVDVIDEO_REALLOC_NOTNEEDED: ShowMessage('DVD Video Realloc Not Needed'); NERO_PHASE_DVDVIDEO_REALLOC_STARTED: ShowMessage('DVD Video Relloc Started'); NERO_PHASE_ENCODE_VIDEO: ShowMessage('Encoding Video'); NERO_PHASE_FORMATTING_SUCCESSFUL: ShowMessage('Formating Successful'); NERO_PHASE_SEAMLESSLINK_ACTIVATED: ShowMessage('Seamless Link Activated'); NERO_PHASE_START_CACHE: ShowMessage('Caching Started'); NERO_PHASE_START_SIMULATE: ShowMessage('Simulation Started'); NERO_PHASE_START_SIMULATE_NOSPD: ShowMessage('Simulation Started - No SPD'); NERO_PHASE_START_TEST: ShowMessage('Testing Started'); NERO_PHASE_START_WRITE: ShowMessage('Writing Started'); NERO_PHASE_START_WRITE_NOSPD: ShowMessage('Writing Started - No SPD'); NERO_PHASE_UNSPECIFIED: ShowMessage('BUP Activated'); end; end; procedure TForm1.Button2Click(Sender: TObject); var flags: Cardinal; begin Flags := NBF_SIMULATE + NBF_CLOSE_SESSION + NBF_BUF_UNDERRUN_PROT + NBF_DISABLE_EJECT; --> zum Test NBF_SIMULATE NeroIsoItem:=NeroCreateIsoItem(); NeroIsoItem.fileName:='F:\test\test.rar'; //insert item in to isotrack if Assigned(NeroWriteCD) then ReallocMem(NeroWriteCD, SizeOf(NERO_WRITE_CD)) else NeroWriteCD :=AllocMem(SizeOf(NERO_WRITE_CD)); NeroWriteCd.nwcdIsoTrack:=NeroCreateIsoTrackEx(NeroIsoItem,'',0) ; if Assigned(NeroDeviceHandle) then NeroCloseDevice(NeroDeviceHandle); NeroDeviceHandle := NeroOpenDevice(@NeroDeviceInfos.nsdisDevInfos[0]); --> Das dauert ein wenig. bei mir ist der Brenner Device 0. //then burn cd NeroBurn(NeroDeviceHandle, NERO_ISO_AUDIO_CD, NeroWriteCD, Flags, 8,@NeroProgress); --> leider brennt er nicht, bin mir nicht sicher, ob die speed stimmt end; procedure TForm1.FormCreate(Sender: TObject); var lpdwSize, lpdwHandle: Cardinal; lpVerInfo, lpVS_FixedFileInfo: Pointer; Counter: Integer; nafi: PNeroAudioFormatInfo; ver1, ver2, ver3,ver4: WORD; initErr: NEROAPI_INIT_ERROR; Callback_1, Callback_2: NERO_CALLBACK; DeviceCount: Integer; Registry: TRegistry; begin NeroIsoTrack := nil; RootIsoItem := nil; NeroDeviceHandle := nil; NeroDeviceInfos := nil; NeroCDInfo := nil; NeroWriteCD := nil; NeroSettings := nil; if (NeroAPIGlueConnect(nil)) then ShowMessage('Connected to NeroAPI !') else begin Showmessage('Cannot connect to NeroAPI !'); exit; end; if (NeroGetAPIVersionEx(ver1, ver2, ver3, ver4, nil)) then Showmessage('Nero API version ' + IntToStr(ver1) + '.' + IntToStr(ver2) + '.' + IntToStr(ver3) + '.' + IntToStr(ver4)) else begin Showmessage('Could not get NeroAPI version number !'); exit; end; NeroSettings := AllocMem(sizeof(NERO_SETTINGS)); Registry := TRegistry.Create(KEY_READ); Registry.RootKey := HKEY_LOCAL_MACHINE; Registry.OpenKey('SOFTWARE\Ahead\Shared', False); NeroSettings.nstNeroFilesPath := PAnsiChar(Registry.ReadString('NeroAPI')); Registry.Free; NeroSettings.nstVendor := ''; NeroSettings.nstSoftware := 'ahead'; NeroSettings.nstLanguageFile := 'nero.txt'; Callback_1.ncCallbackFunction := @IdleCallback; Callback_1.ncUserData := nil; NeroSettings.nstIdle := Callback_1; NeroSettings.nstEnableOverburn := False; NeroSettings.nstOverburnSize := 0; initErr := NeroInit(@NeroSettings, nil); case (initErr) of NEROAPI_INIT_OK: begin end; NEROAPI_INIT_INVALID_ARGS: Showmessage('NeroInit() : invalid args'); NEROAPI_INIT_INVALID_SERIAL_NUM: Showmessage('NeroInit() : invalid serial number'); NEROAPI_INIT_DEMOVERSION_EXPIRED: Showmessage('NeroInit() : demo version has expired'); NEROAPI_INIT_CANNOT_LOCK: Showmessage('NeroInit() : cannot lock'); NEROAPI_INIT_UNSPECIFIED_ERROR: Showmessage('NeroInit() : unspecified error'); else Showmessage('NeroInit() : unspecified error'); end; if initErr <> NEROAPI_INIT_OK then Exit; NeroDeviceInfos := PNeroSCSIDeviceInfos(NeroGetAvailableDrivesEx(MEDIA_CD, nil)); if not Assigned(NeroDeviceInfos) then ShowMessage('NeroGetAvailableDrives()'); NeroProgress.npProgressCallback := ProgressCallback; NeroProgress.npAbortedCallback := AbortedCallback; NeroProgress.npAddLogLineCallback := AddLogLine; NeroProgress.npSetPhaseCallback := SetPhaseCallback; NeroProgress.npUserData := NeroSettings; NeroProgress.npDisableAbortCallback := DisableAbortCallback; NeroProgress.npSetMajorPhaseCallback := SetMajorPhaseCallback; end; end. Hat jemand eine Idee? Tausend Dank, Gina. |
Re: DelphiNeroApi - Dateien übergeben
Der Ansatz ist schonmal richtig, aber zum hinzufügen fehlt noch ein bißchen Code.
Zu finden ist das ganze in der DemoApp im Ordner Demo. Die wichtigen Teile für eine ISO sind unter WMDropFiles bei "case pcWrite.TabIndex of" zu finden:
Delphi-Quellcode:
Die tvIso-Zeile hab ich zu Testwecken hinzugefügt (unsicher), um die Visualisierung zu testen.
1:
begin if Assigned(NeroWriteCD) then ReallocMem(NeroWriteCD, SizeOf(NERO_WRITE_CD)) else NeroWriteCD :=AllocMem(SizeOf(NERO_WRITE_CD)); if not Assigned(RootIsoItem) then begin RootIsoItem := NeroCreateIsoItem(); RootIsoItem.fileName := ''; end; { TODO : Add Visual return of added files and directories } AddFileToRootIsoItem(RootIsoItem, WhichFiles.Strings[i]); tvIso.Items.Add(TTreeNode.Create(tvIso.Items), WhichFiles.Strings[i]); end; Für den weiteren wichtigen Code musst du dir die Prozedur AddFileToRootIsoItem angucken. |
Re: DelphiNeroApi - Dateien übergeben
Auch auf die Gefahr hin, jetzt Haue zu bekommen. Warum soll ich mit "meinem" Brennproggie die Nero-API nutzen? Dazu muss ja Nero auf dem Rechner installiert sein. Dann kann man auch Nero zum brutzeln nehmen. Das lässt eigentlich keine Wünsche offen.
Gruss EL |
Re: DelphiNeroApi - Dateien übergeben
Warum soll ich mit "meinem" Browser den TWebBrowser verwenden? OK, er ist bei Windows dabei.
Naja, nicht jeder hat Nero Retail und nicht jedem gefällt, das man unter Nero OEM nur Express benutzen kann. Aber im Endeffekt stelle ich mir diese Frage auch öfter, jetzt wollte ich mir aber mal aus gegebenem Anlass völlig wertfrei diese API angucken. |
Re: DelphiNeroApi - Dateien übergeben
Zitat:
(Kann mir aber eh wurscht sein, weil kein nero hab' und 'nie haben werde) |
Re: DelphiNeroApi - Dateien übergeben
Hallo,
erstmal vielen dank für die Antworten, ich werde mir die entsprechenden Teile genauer ansehen... Als ich mit dem debugger durch die Demo durchbin, ist er da irgendwie gar nicht vorbeigekommen. Kein Wunder, wenn es nicht geklappt hat. Andererseits sollen die Dateien auch nicht nochmal gedropt werden, die hab ich ja schon in einer Liste. Ich muss sie nur noch übergeben... Der Zugriff auf die Nero-Api funktioniert nur, mit einer registrierten Voll- bzw. OEM-Version. Hintergrund für mich: Das Programm, welches ich schreibe, soll auch nicht versierten Benutzern die Möglichkeit bieten, komfortable ein Backup incl. Verschlüsselung und Brennen ihrer Daten zu machen. Das Ganze geschieht sozusagen auf Knopfdruck. Wer sich mit Nero auskennt und lieber selbst die Einstellungen vornimmt, der kann natürlich Nero auch direkt aufrufen. Für die anderen nehme ich die Einstellungen bereits vor. Ich hoffe, nun ist es etwas verständlicher... Ansonsten gebe ich Euch natürlich Recht. ;) Nochmals vielen Dank, ich melde mich alsbald mit den nächsten Testergebnissen. Gina. |
Re: DelphiNeroApi - Dateien übergeben
Hmm, irgendiwe will es nicht so recht klappen. Irgendetwas fehlt wohl noch... :cry:
Wenn ich das recht verstanden habe, dann ist doch AddFileToRootIsoItem dafür da, eine alte Session einzulesen, damit er den Index übernehmen kann, oder? Da ich ja noch nicht zum brennen gekommen bin, habe ich also noch keine ;) Mit NeroCreateIsoItem() erstelle ich einen neuen Eintrag, oder? Doch irgendwie fehlt mir die Verbindung zwischen dem Hinzufügen und dem Aufruf von NeroBurn(...) Kann mir das nochmal jemand genauer erklären please? Tausend Dank, Gina. |
Re: DelphiNeroApi - Dateien übergeben
Nein, die Funktion AddFileToRootIsoItem tut einiges mehr, das hinzufügen zu einer "alten Session" (nicht im Sinne von bereits auf dem Rohling, sondern im Programm angefangene Session) wird nur in den ersten 10 Zeilen geregelt. Der Rest sorgt für das korrekte anlegen eines Eintrags mit Datum und Uhrezeit usw. plus Unterscheidung zwischen Ordner und einzelner Datei.
|
Re: DelphiNeroApi - Dateien übergeben
Ahh, ok, soweit hab ich es jetzt auch nachvollziehen können. Vielen Dank. Und nachdem ich auch noch in der Funktion AbortedCallback Result := False gesetzt habe, hat er auch etwas gebrannt. :D
Nun muss ich aber als nächstes doch den alten Track auf der CD einlesen, bevor es weiter geht, denn es soll ja eine Multisession werden. Bisher habe ich nur TdnapiIsoTrack.GetName und TdnapiIsoTrack.GetTrackType gefunden, doch das reicht sicher nicht, oder? Außerdem läuft er auf einen Fehler, wenn ich einen Ordner brennen will. Und zwar an der Stelle, wo das DateiDatum ausgelesen wird. Ist ja auch klar, da das ja nicht für Ordner gedacht ist. Muss ich da den Teil der Demo entsprechend anpassen, oder steckt dort ein tieferer Sinn dahinter? Vielen lieben Dank schonmal, Gina. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz