Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DelphiNeroApi - Dateien übergeben (https://www.delphipraxis.net/42078-delphineroapi-dateien-uebergeben.html)

Gina 13. Mär 2005 11:59


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.

Gina 13. Mär 2005 16:16

Re: DelphiNeroApi - Dateien übergeben
 
So, hier mal meine aktuelle Test-Unit, vielleicht könnt ihr mir dann besser helfen ;)

Delphi-Quellcode:
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.
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...
Hat jemand eine Idee?

Tausend Dank, Gina.

scp 13. Mär 2005 22:23

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:
          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;
Die tvIso-Zeile hab ich zu Testwecken hinzugefügt (unsicher), um die Visualisierung zu testen.
Für den weiteren wichtigen Code musst du dir die Prozedur AddFileToRootIsoItem angucken.

emsländer 13. Mär 2005 22:32

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

scp 13. Mär 2005 22:38

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.

Kernel32.DLL 13. Mär 2005 22:48

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von emsländer
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

Hmm.... Kann man die Nero-API eigentlich noch verwenden, wenn auf dem Zielrechner 'ne abgelaufene Demoversion ist? Wenn ja, hätte ich einen generellen Verwendungszweck....

(Kann mir aber eh wurscht sein, weil kein nero hab' und 'nie haben werde)

Gina 14. Mär 2005 16:52

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.

Gina 14. Mär 2005 18:44

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.

scp 14. Mär 2005 23:42

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.

Gina 15. Mär 2005 17:33

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.

scp 15. Mär 2005 23:22

Re: DelphiNeroApi - Dateien übergeben
 
Das mit dem Ordner ist allerdings merkwürdig, schliesslich zeigt er das Datum ja auch im Explorer usw. an.
Entweder ist das ein Bug von Windows, von Delphi oder ein bißchen von beidem: FileAge gibt bei Ordnern generell -1 zurück, da ich den Quelltext dank D3 Pro habe, hab ich das zum Test verändert. und sie da:
nur wenn man z.B. statt dem Ordner 'C:\SIK' das Datum von 'C:\SIK\.' abfragt, gehts.

Da das Datum aber eh egal ist bei Ordnern, würde ich es so lösen:
Delphi-Quellcode:
  If DirectoryExists(FileName) then
    FileTime := now
  else
    FileTime := FileDateToDateTime(FileAge(FileName));
EDIT:
Achja und die Ordner-Verarbeitung ist noch total unbrauchbar.
In der Schleife von AddFileToRootIsoItem ist die Rekursion falsch. Hier muss die Sache z.B. so aussehen:
Delphi-Quellcode:
        If (sr.Name <> '.') and (sr.Name <> '..') then // Zeile neu eingefügt
          AddFileToRootIsoItem(SubDirItem, FileName + '\' + sr.Name); // "FileName + '\' +" hinzugefügt
      until FindNext(sr) <> 0; // diese bleibt wie sie ist
EDIT2: Zusammengefasst :-)

Gina 16. Mär 2005 17:41

Re: DelphiNeroApi - Dateien übergeben
 
Hi,

danke für den Tipp. Bin gestern dort abgestorben, da mein Kopf irgendwie nach einer Pause geschrieen hat ;)

Hab das mal in etwa so eingebaut. Die Abfrage nach '.' und '..' hab ich vorn angestellt. Außerdem hab ich noch ne Try finally eingebaut. Momentan sieht die procedure AddFileToRootIsoItem so aus:

Delphi-Quellcode:
procedure TForm1.AddFileToRootIsoItem(var RootItem: PNeroIsoItem; FileName: String);
var
  FileTime: TDateTime;
  tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_msec: WORD;
  TempItem, SubDirItem: PNeroIsoItem;
  sr: TSearchRec;
begin
  TempItem := RootItem;

  if not (RootItem.fileName = '') then
  begin
    while Assigned(TempItem.nextItem) do
      TempItem := TempItem.nextItem;

    TempItem.nextItem := NeroCreateIsoItem();
    TempItem := TempItem.nextItem;
  end;

  StrPCopy(TempItem.fileName, ExtractFileName(FileName));
  TempItem.fileName[SizeOf(TempItem.fileName) - 1] := #00;

  StrPCopy(TempItem.sourceFilePath, FileName);
  TempItem.fileName[SizeOf(TempItem.sourceFilePath) - 1] := #00;

  If DirectoryExists(FileName) then
     FileTime := now
  else
     FileTime := FileDateToDateTime(FileAge(FileName));
  DecodeDateTime(FileTime, tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_msec);

  TempItem.entryTime.tm_year := tm_year;
  TempItem.entryTime.tm_mon := tm_mon;
  TempItem.entryTime.tm_wday := DayOfTheWeek(FileTime);
  TempItem.entryTime.tm_mday := DayOfTheMonth(FileTime);
  TempItem.entryTime.tm_yday := DayOfTheYear(FileTime);
  TempItem.entryTime.tm_isdst := WORD(False);
  TempItem.entryTime.tm_hour := tm_hour;
  TempItem.entryTime.tm_min := tm_min;
  TempItem.entryTime.tm_sec := tm_min;

  TempItem.isReference := False;
  TempItem.isDirectory := DirectoryExists(FileName);
  TempItem.importinfo := nil;
  TempItem.userData := nil;
  TempItem.subDirFirstItem := nil;
  SubDirItem := nil;

  if TempItem.isDirectory then
    if FindFirst(IncludeTrailingPathDelimiter(FileName) + '*.*', faAnyFile + faHidden + faArchive + faReadOnly + faSysFile + faDirectory, sr) = 0 then
    try
      repeat
       if (SR.Name <> '.') and (SR.Name <> '..') then begin
        if Assigned(SubDirItem) then
        begin
          SubDirItem.nextItem := NeroCreateIsoItem();
          SubDirItem.fileName := '';
          SubDirItem := SubDirItem.nextItem;
        end
        else
        begin
          SubDirItem := NeroCreateIsoItem();
          SubDirItem.fileName := '';
          TempItem.subDirFirstItem := SubDirItem;
        end;

        AddFileToRootIsoItem(SubDirItem, IncludeTrailingPathDelimiter(FileName) +sr.Name);
       end;
      until FindNext(sr) <> 0;
    finally
      FindClose(sr);
    end;
end;
So ganz klappt es aber noch nicht. Er brennt zwar den Ordner, aber der Inhalt ist nicht zu sehen. Außerdem bekomme ich ständig diese Meldungen:
Zitat:

Joliet names of these files (listed here in ISO-L3) are the same
Als wenn er die Zeichenanzahl des kompletten Pfades mitzählen würde. Mit nem ganz kurzen Pfad konnte ich wenigstens brennen, aber wie gesagt, der Inhalt ist nicht zu sehen. Die Optionen für die langen Pfad- und Dateinamen hab ich noch nicht gefunden... Welche Flags benutzt du?

Bis denne, Gina.

scp 18. Mär 2005 01:06

Re: DelphiNeroApi - Dateien übergeben
 
So, habe endlich die groben Fehler des Demos gefunden, ordner wird einwandfrei gebrannt.

Mal wieder in AddFileToRootIsoItem:
Delphi-Quellcode:
  If DirectoryExists(FileName) then
    StrPCopy(TempItem.sourceFilePath, '')  // sourceFilePath bleibt bei Ordnern leer
  else
    StrPCopy(TempItem.sourceFilePath, FileName);
  TempItem.sourceFilePath[SizeOf(TempItem.sourceFilePath) - 1] := #00; // hier war .filename angegeben
Auch in AddFileToRootIsoItem (in der repeat-Schleife):
Delphi-Quellcode:
          if Assigned(SubDirItem) then
          begin
            SubDirItem.nextItem := NeroCreateIsoItem();
            SubDirItem.nextItem.fileName := ''; // nextitem ist das neue, also hier filename setzen
            SubDirItem := SubDirItem.nextItem;
          end

In IdleCallback und AbortedCallback muss als result false zurückgegeben werden. Möchtest du einen "Abbrechen"-Knopf einbauen, brauchst du eine globale Variable die dann bei drücken auf true gesetzt wird.

jbg 18. Mär 2005 11:02

Re: DelphiNeroApi - Dateien übergeben
 
Würde es dir was ausmachen, wenn man das in den DelphiNeroAPI CVS eincheckt?

scp 18. Mär 2005 13:06

Re: DelphiNeroApi - Dateien übergeben
 
Nö, kein Thema, wäre mir sogar recht.
Ich selbst hab mich mit dem Thema CVS noch nicht so befasst, sonst hätte ich es selbst gemacht.

jbg 18. Mär 2005 13:26

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von scp
Ich selbst hab mich mit dem Thema CVS noch nicht so befasst, sonst hätte ich es selbst gemacht.

Dazu brauchst du aber CVS Schreibrechte, die du wohl nicht hast.

Die Änderungen sind jetzt drinnen (mit ein paar kleineren, nicht die Logik verändernden, Ausbesserungen).

scp 18. Mär 2005 16:10

Re: DelphiNeroApi - Dateien übergeben
 
Hier noch zwei Dinge, die mir beim erstellen einer SVCD aufgefallen sind:
Beim verwenden von NeroCreateIsoTrackEx muss offfensichtlich immer ein Trackname als zweiter Parameter angegeben werden, bei AudioCDs und VideoCDs steht dort jedoch nil. Zu finden in WMDropFiles

Ebenfalls bei WMDropFiles fehlt bei (S)VCDs die Speicherzuweiseng von paBuffer:
Delphi-Quellcode:
          if NeroWriteVideoCD.nwvcdTempPath = '' then
          begin
            GetMem(paBuffer, MAX_PATH);
            try
              //...
            finally
              FreeMem(paBuffer);
            end;

Gina 18. Mär 2005 17:53

Re: DelphiNeroApi - Dateien übergeben
 
Uii, supi, ihr seid meine Helden... :love:

Jetzt hat er auch keine Probleme mehr mit den langen Pfaden. Alle Ordner und Unterordner und Unterunterordner etc. sind da. Jetzt muss ich mich nur noch um die Übergabe der alten Session kümmern.

Hat zufällig einer von Euch eine Idee, warum das Einlesen des Brenners (NeroDeviceInfos) so ewig dauert? Ist das bei Euch auch so? Oder liegt das an meinem PC?

Bis denne, Gina.

scp 18. Mär 2005 19:30

Re: DelphiNeroApi - Dateien übergeben
 
Dauert bei mir etwa 3 Sek. (AMD 2GHz, LG GCE-8320).

Gina 18. Mär 2005 20:02

Re: DelphiNeroApi - Dateien übergeben
 
Ahh, ok, dann scheint es an meinem System zu liegen. Hab zwar einen 3,2 P4, aber vielleicht mag er ja das HT nicht... Ich werds morgen mal auf einem anderen PC probieren. Danke dir.

Hab jetzt nochmal intensiv das Brennen von Ordnern getestet. Auch Namen mit Leerzeichen sind kein Problem. Da bin ich echt beruhigt ;)

Nur das Einlesen der alten Session will nicht klappen. Da hab ich wohl noch nicht den richtigen Befehl gefunden... :( Ich suche weiter...

Thx, Gina.

Gina 19. Mär 2005 11:33

Re: DelphiNeroApi - Dateien übergeben
 
Morgen...,

ich hab es geschafft, eine Session zu importieren. Leider nicht 100% erfolgreich.

Zunächst muss man in der NeroApi.pas bei InitNeroAPIFunctions hinzufügen:

Delphi-Quellcode:
NeroImportDataTrack := GetNeroProc('NeroImportDataTrack');
Dann habe ich vor dem ersten AddFileToRootIsoItem diese Zeile eingefügt:

Delphi-Quellcode:
RootIsoItem := NeroImportDataTrack(NeroDeviceHandle,NeroCDInfo.ncdiNumTracks-1,ppCDStamp,pInfo,NIITEF_IMPORT_ISO_ONLY,pResult,nil);
Bei NeroCDInfo.ncdiNumTracks mußte ich -1 angeben, damit er die letzte Session einliest. Folgende Variablen mußten noch deklariert werden:

Delphi-Quellcode:
ppCDStamp: PPointer;
pInfo: PNERO_IMPORT_DATA_TRACK_INFO;
pResult: PNERO_IMPORT_DATA_TRACK_RESULT;
Diese werden beim Aufruf von NeroImportDataTrack gefüllt, sind also zunächst nil.

So, nun dazu, warum es nicht 100% waren. Ich habe jetzt zwei Ordner auf der CD, die jeweils ca. 4,1 MB groß sind. Die Dateien sind alle da und die Ordnergrößen an sich werden im Explorer korrekt angezeigt. Allerdings zeigt die Gesamtgröße der CD nur 5,8 MB an, obwohl es ja ca. 8,2 MB sein müßten. Hat jemand dazu eine Idee?

Und da wir gerade bei Größenangaben sind:

Delphi-Quellcode:
ShowMessage(IntToStr(NeroCDInfo.ncdiFreeCapacityInBlocks) + ' Free Blocks (' + FloatToStrF(NeroCDInfo.ncdiFreeCapacityInBlocks * 2352 / 1024 / 1024 ,ffGeneral, 3, 3) + ' MB)');
Das liefert bei mir total abwegige Ergebnisse. Ein 700 MB Rohling hat angeblich eine Kapazität von 802 MB. Woher kommt die Zahl 2352? Es kann doch nur daran liegen, oder?

Thx, Gina.

scp 19. Mär 2005 11:57

Re: DelphiNeroApi - Dateien übergeben
 
Die 2352 stehen für die Bytes/Block. Für Rohdaten hast du tatsächlich 802MB zur Verfügung, z.B. wenn du eine (S)VCD oder eine Audio CD brennst, bei Daten-CDs werden dann ca. 100MB für CRC-Checks benötigt. Hier eine kleine Liste:
Code:
Audio CD             : 2352
(Super) VideoCD      : 2324
ISO Level 1 Mode 1    : 2048
ISO Level 2 Mode 1    : 2336
ISO Level 1 Mode 2/XA : 2048
ISO Level 2 Mode 2/XA : 2324
Irrtümer vorbehalten.

Gina 19. Mär 2005 12:43

Re: DelphiNeroApi - Dateien übergeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ahh, vielen Dank, dann ist das ja klar...

Habe auch gerade das Einlesen der Brenner-Infos auf einem anderen PC probiert. Dort geht es auch sehr schnell. Nur bei mir nicht... *grübel*

Außerdem hab ich meine angefangene CD mal mit Nero geprüft. Er zeigt mir im Arbeitsplatz also nur die Größe der letzten Session an. Muss ich ihm die beim Einlesen der Session noch übergeben? Wenn ja wie ? Ich hab mal einen Screenie der Sessions angehängt. Es sieht so aus, als wenn zwischen den Tracks eine ziemlich große Pause ist. Was kann ich da tun?

Tausend Dank, Gina.

PS: Mit den dort angezeigten Sessions sind etwa 137 MB der CD belegt...

jbg 19. Mär 2005 16:10

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von scp
Beim verwenden von NeroCreateIsoTrackEx muss offfensichtlich immer ein Trackname als zweiter Parameter angegeben werden, bei AudioCDs und VideoCDs steht dort jedoch nil.

Ausgebessert.

Zitat:

Ebenfalls bei WMDropFiles fehlt bei (S)VCDs die Speicherzuweiseng von paBuffer:
Ausgebessert. paBuffer wurde als string benutzt, war aber als PAnsiChar deklariert. Ich habe das jetzt komplett auf string umgeschrieben.

Zitat:

Zunächst muss man in der NeroApi.pas bei InitNeroAPIFunctions hinzufügen:
Ist auch im CVS.

Gina 19. Mär 2005 16:53

Re: DelphiNeroApi - Dateien übergeben
 
Super jbg, vielen Dank.

Hast du das schon integriert? Oder eine andere Lösung dafür? Muß man vielleicht wirklich das \. auselesen, um das Datum eines Ordners zu bekommen?

Zitat:

Zitat von scp
Da das Datum aber eh egal ist bei Ordnern, würde ich es so lösen:
Delphi-Quellcode:
  If DirectoryExists(FileName) then
    FileTime := now
  else
    FileTime := FileDateToDateTime(FileAge(FileName));

Ich hänge immernoch an den drei Speicherplatzproblemen fest:

1) Warum belegt er so viel mehr Speicher, als die Dateien groß sind? Hat das was mit der Reservierung durch #0 zu tun?
2) Wie übergebe ich den bisher belegten Platz?
3) Wenn die CD nicht genug Platz hat, wirft er sie aus, es kommt aber keine Meldung. Wie frage ich nach der AddFileToRootIsoItem ab, wieviel Platz die Zusammenstellung belegt?

Oje, Fragen über Fragen...

jbg 19. Mär 2005 22:22

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von Gina
Delphi-Quellcode:
  If DirectoryExists(FileName) then
    FileTime := now
  else
    FileTime := FileDateToDateTime(FileAge(FileName));

Der FileAge Code schließt Verzeichnis explizit aus.
Delphi-Quellcode:
function DirectoryAge(const DirectoryName: string): Integer;
var
  sr: TSearchRec;
begin
  Result := -1;
  if FindFirst(DirectoryName, faAnyFile or faDirectory, sr) = 0 then
  begin
    Result := sr.Time;
    FindClose(sr);
  end;
end;
Ist bereits im CVS Code drinnen.

scp 19. Mär 2005 22:46

Re: DelphiNeroApi - Dateien übergeben
 
@jbg
Das ist gut. Fehlt jetzt evtl. nur noch ein "Abbrechen"-Knopf für die Rückgabewerte von IdleCallback und AbortedCallback.
AudioCDs hab ich auch getestet, das klappt zwar, da kommt aber am Ende meistens eine Schutzverletzung, weis noch nicht woran das liegt.

@gina
Habe mich mal mit MultiSession beschäftigt, aber irgendwas fehlt da noch. Muss irgend ein Flag oder so sein. Er importiert zwar die Session, aber wie du sagst die Gesamtgrösse stimmt nicht und das echte Nero erkennt es nicht als Nero-eigenes MultiSession-Format.

Gina 20. Mär 2005 12:03

Re: DelphiNeroApi - Dateien übergeben
 
Hi,

eine AV ist bei mir auch aufgetaucht, und zwar, wenn die CD voll ist. Wenn noch ein wenig Platz ist, dann wirft er sie nur aus, wenn sie aber total voll ist, kommt eine AV.

Die Meldung von Nero, dass es nicht das Mutlisessionformat ist, hab ich auch bekommen. Das liegt sicher daran, dass er nicht alle Informationen eingelesen hat, die er braucht, um die Session korrekt fortzuschreiben...

Und dann hab ich die Sache mit dem Speicherverbrauch mal genauer analysiert. Nach dem ersten Track macht er eine Pause von 02:32.00 Minuten. Nach jedem weiteren Track jeweils eine Pause von 01:32.00 Minuten. Das ergibt bei 5 Sessions etwa 76 MB verschenkter Platz...

Es gibt doch bei Audio-CDs so eine Option, wo man die Pause weglassen kann. Hat es damit vielleicht etwas zu tun? (Kenne mich mit Audio-CDs nicht so aus)

@jbg

Eine Frage zur DirectoryAge: Sehe ich das richtig, dass bei einem Ordner dann kein Datum zurückgegeben wird? Bei mir zumindest ist es so. Je nachdem, ob ich den Pfad mit Backslash übergebe (Result -1) oder ohne Backslash (Result ist ungültiges Timeformat). *grübel*

Thx, Gina.

jbg 21. Mär 2005 18:22

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von Gina
Eine Frage zur DirectoryAge: Sehe ich das richtig, dass bei einem Ordner dann kein Datum zurückgegeben wird?

Bei einem Ordner wird DirectoryAge() aufgerufen, und das liefert das Datum, wenn das Verzeichnis existiert, sonst -1. Da es FindFirst benutzt, darfst du natürlich keinen Backslash am Ende übergeben, da es dann kein gültiger Dateiname mehr ist.

Gina 21. Mär 2005 21:51

Re: DelphiNeroApi - Dateien übergeben
 
Hmm, komisch. Und wieso bekomme ich dann eine Fehlermeldung, wenn ich den Pfad ohne Backslash übergebe? Liegt das etwa auch an meinem D6?

Zu dem Speicherverbrauch:

Ich nehme alles zurück und behaupte das Gegenteil... ;) Denn heute haben wir herausgefunden, dass Nero direkt bei Multisession ebenfalls soviel Speicher verbraucht. Wohl für Lead-In-Lead-Out. Ist mir echt noch nie aufgefallen... :oops: Das ist ja der poore Wahnsinn...

Trotzdem bleibt die Sache mit der Übergabe des bisher belegten Speicherplatzes... :gruebel:

Bis denne, Gina.

jbg 21. Mär 2005 22:37

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von Gina
Liegt das etwa auch an meinem D6?

Nein. Kann es sein, dass der Pfad nicht existiert, oder "C:", "D:", ... ist?

delphifan2004 22. Mär 2005 00:11

Re: DelphiNeroApi - Dateien übergeben
 
Hallo!

Ich war mal auf Sourceforge, um das NeroAPI runterzuladen.

Zwei Fragen habe ich:

Welche Version ist die optimale. Ist es die neueste? Frage wegen Stabilität und Bugs.

Ich verwende Nero Version 5.0.3.3

Hab mal in Delphi unter Typbibliothek importieren geguckt, da ich das CD-Brennprogramm Nero benutze, ob da irgenwas angeboten wird. Nichts. Hätte schon ein Interface erwartet. Jetzt gibt es nun das NeroAPI. Greift das direkt auf die CD-Brenner Hardware zu? Ich gehe in meiner Fragestellung von der Annahme aus, das das eine mit dem anderen auch zu tun hat, ich also mit dem NeroAPI meine CD-Brenner ansteuere.

Und da ich bereits Nero zum Brennen benutze, bietet sich dieses API an.

Delphifan2004

Gina 24. Mär 2005 20:38

Re: DelphiNeroApi - Dateien übergeben
 
hallochen, sorry, wenn ich mich jetzt erst melde, hatte die Woche viel zu tun... :(

Zitat:

Zitat von jbg
Zitat:

Zitat von Gina
Liegt das etwa auch an meinem D6?

Nein. Kann es sein, dass der Pfad nicht existiert, oder "C:", "D:", ... ist?

Nein, ich hatte Pfade, wie 'F:\test' oder 'D:\dat' probiert. Die Pfade existieren. Ich verstehe es auch nicht so recht... :gruebel:

@delphifan2004
Wenn ich das richtig sehe, mußt du für die DelphiNeroApi mindestens Nero 5.5.8.3 installiert haben. Je höher deine Nero-Version, desto mehr Features werden unterstützt. Ideal ist natürlich die aktuelle 6er Version.

Wenn du die DelphiNeroApi verwenden willst, dann installierst du einfach das Package und schaust dir die Demo genauer an. Vor allem die aktualisierte im CVS auf sourceforge.

Wenn du 'nur' mit dem SDK von Ahead arbeiten willst, dann nimmst du die Com-Bibliothek, dann brauchst du die DelphiNeroApi eigentlich gar nicht (damit hab ich mich aber noch überhaupt nicht beschäftigt). Und dafür brauchst du mindestens Nero 6...

Ich hoffe, ich hatte deine Frage halbwegs richtig verstanden ;)

@ all
Hat schon jemand etwas herausgefunden in bezug auf die Übergabe der Größe der alten Sessions?

Thx und lG, Gina.

delphifan2004 24. Mär 2005 22:00

Re: DelphiNeroApi - Dateien übergeben
 
Hallo Gina!

Danke erst mal für Deine Antwort!

Zitat:

Zitat von Gina
Wenn ich das richtig sehe, mußt du für die DelphiNeroApi mindestens Nero 5.5.8.3 installiert haben.

Da werd ich wohl mal die CDs meiner PC Zeitschriften durchsuchen müssen. Da war irgendwo ne höhere Nero-Version. Sonst muss ich wohl Nero kontaktieren, wegen ner höheren Version. Danach hab ich zwar gar nich gefragt, ist aber trotzdem wichtig zu wissen. Mit der falschen Nero-Version funzt dann einiges nicht. Danke für den Hinweis.

Zitat:

Zitat von Gina
Wenn du die DelphiNeroApi verwenden willst, dann installierst du einfach das Package und schaust dir die Demo genauer an. Vor allem die aktualisierte im CVS auf sourceforge.

Werd ich über die Feiertage machen.

Zitat:

Zitat von Gina
Wenn du 'nur' mit dem SDK von Ahead arbeiten willst, dann nimmst du die Com-Bibliothek, dann brauchst du die DelphiNeroApi eigentlich gar nicht (damit hab ich mich aber noch überhaupt nicht beschäftigt). Und dafür brauchst du mindestens Nero 6...

Da werde ich erst mal sehen , was ich auf meinen CDs finde. Da war mal ne Version, die sich, wenn Nero installiert ist als Update, sonst als 30 Tage Testversion installiert. Weiß aber deren Versionsnummer nicht mehr.

Zitat:

Zitat von Gina
Ich hoffe, ich hatte deine Frage halbwegs richtig verstanden

Nein, nicht ganz, meine Frage war eigentlich die nach der optimalen Version des NeroAPI auf Sourceforge. Dort gibt es ja mehrere. Hab jetzt die 0.42a genommen. Es gibt ja noch die 0.41 und die 0.40. Meine eigentliche Frage bezog sich auf diejenige Version (von diesen 3) die zu meiner aktuellen Nero-Version paßt. Ich hab die 0.42 genommen, da brauch ich also Nero 5.5.8.3.
Nun, wenn ich die 0.40 genommen hätte, käme ich dann mit Nero 5.0.3.3 aus? Kann ich ja mal testen.

Trotzdem Danke für Deine Tipps. Da weiß ich erst mal bezüglich vorausgesetzter Nero-Version Bescheid. Ich wollte mich von der entgegengesetztn Seite nähern. Werde auf jeden Fall auch die Version 0.40 des NeroAPI mal testen.

Es grüßt Dich

Delphifan2004

Gina 24. Mär 2005 22:18

Re: DelphiNeroApi - Dateien übergeben
 
Hi delphifan2004,

ich würd auf jeden Fall die neueste Version der DelphiNeroApi benutzen. Ich hab die älteren Versionen allerdings auch nicht getestet. Im Zweifel wirst du es wohl wirklich selbst ausprobieren müssen, falls nicht doch noch jemand hier Erfahrungen damit hat... ;)

LG, Gina.

Gina 25. Mär 2005 20:52

Re: DelphiNeroApi - Dateien übergeben
 
Hi Ihrs...,

hat jemand eine Idee, wo ich die ganzen Texte aus NERO_SET_PHASE_CALLBACK finde? ich wollte die alle ins deutsche übersetzen. Die für NERO_SET_MAJOR_PHASE_CALLBACK hab ich gefunden, aber die ersten nicht...

Und weiß jemand, wie ich die aktuell benutzte Brenngeschwindigkeit abfrage? Ich gebe ihm die zwar vor bei NeroBurn, aber wenn die CDR z.B. nur weniger kann, dann ändert er das ja...

Bin für jeden Tipp dankbar ;)

Gina.

Garfield 25. Mär 2005 22:36

Re: DelphiNeroApi - Dateien übergeben
 
Zitat:

Zitat von Kernel32.DLL
Hmm.... Kann man die Nero-API eigentlich noch verwenden, wenn auf dem Zielrechner 'ne abgelaufene Demoversion ist? Wenn ja, hätte ich einen generellen Verwendungszweck....

Könnte durchaus möglich sein. Das ImgTool Burn von CouJo soll auch mit einer abgelaufenen Demo laufen.

Gina 28. Mär 2005 18:56

Re: DelphiNeroApi - Dateien übergeben
 
Ähmmm... Die NeroApi prüft natürlich, ob die Demoversion abgelaufen ist. Und ob man das nun umgehen kann oder nicht, gehört nicht hier her, da es ja schießlich illegal wäre ;)

So, back to Topic:

Das mit der Übergabe der Größe der alten Session hat sich erledigt, da Nero selbst das auch nicht macht. Offensichtlich geht es nicht.

Nun habe ich aber ein anderes Problem. Ich hab natürlich auch einen Button eingebaut zum Formatieren der CD-RW. Er macht es auch. Ich kann sogar die benötigte Zeit vorher mit

Delphi-Quellcode:
Time := NeroGetCDRWErasingTime(NeroDeviceHandle, NEROAPI_ERASE_ENTIRE);
erechnen lassen. Das haut soweit auch hin.

Nur, wenn ich dann

Delphi-Quellcode:
Time := NeroEraseCDRW(NeroDeviceHandle, NEROAPI_ERASE_ENTIRE);
aufrufe, hab ich noch keine Möglichkeit gefunden, meine Anwendung in irgendeiner Form weiter arbeiten zu lassen, geschweige denn, einen Status anzuzeigen. Sie hängt einfach nur, egal wie viele Application.ProcessMessages ich einbaue. Im Hintergrund allerdings tut er sein Werk und formatiert die CD. Und wenn er fertig ist, dann erwacht auch mein Programm wieder zum Leben.

Ich bräuchte jetzt ganz dringend einen super Tipp, wie ich mein Programm vor dem "aufhängen" bewahre, um wenigstens etwas ausgeben zu können... Hat sich schon jemand mit dem Formatieren beschäftigt? Das Testen ist auch etwas mühseelig, da einmal formatieren etwa 11 Minuten dauert und nicht abgebrochen werden kann...

Bin also für jeden noch so kleinen Tipp ganz doll dankbar.

Liebe Grüße, Gina.

Chewie 28. Mär 2005 18:59

Re: DelphiNeroApi - Dateien übergeben
 
Du lagerst den Brenn- bzw. Löschvorgang einfach in einen seperaten Thread aus.
Ob es aber Möglichkeiten der Rückmeldung (z.B. Fortschritt) gibt, weiß ich nicht, da ich die API nicht kenne.

Gina 5. Apr 2005 21:08

Re: DelphiNeroApi - Dateien übergeben
 
Hallochen,

wollte mal kurz ein Statement geben über den Stand der Dinge... ;)

Das mit dem Extra Thread zum Formatieren der RW hat ja inzwischen geklappt. Auch das Auslesen und Einstellen der Brenngeschwindigkeit hab ich hinbekommen. Und die Sache mit den deutschen NeroProgressTexten. Jetzt sieht alles richtig super aus. Ich werde, sobald mein Projekt fertig ist (steht kurz vor dem Abschluss), mein Testprojekt mit den Nero-Routinen etwas aufbereiten (kommentieren etc.) und hier einstellen, falls das mal jemand braucht. Aber zuerst muss wie gesagt mein Projekt fertig sein, da die Zeit drängt. Es sind zwar "nur" noch ein paar Kleinigkeiten, aber es muss nochmal intensiv getestet werden. Daher kann es noch ein klein wenig dauern...

An dieser Stelle nochmal vielen lieben Dank für die tolle Hilfe. Ich hoffe, ich kann mich mal entsprechend erkenntlich zeigen...;)

Liebe Grüße, Gina.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Seite 1 von 2  1 2      

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