AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Arbeiten mit "ShFileOperation" --> ab 2ten Mal verweigert
Thema durchsuchen
Ansicht
Themen-Optionen

Arbeiten mit "ShFileOperation" --> ab 2ten Mal verweigert

Ein Thema von Jlagreen · begonnen am 14. Sep 2006 · letzter Beitrag vom 14. Sep 2006
Antwort Antwort
Jlagreen

Registriert seit: 14. Aug 2006
3 Beiträge
 
#1

Arbeiten mit "ShFileOperation" --> ab 2ten Mal

  Alt 14. Sep 2006, 14:28
Hallo,

also ich arbeite seit einigen Monaten an meiner Diplomarbeit und bin auch fast fertig. Meine Aufgabe bestand/besteht darin eine Anlage zu bauen, die über ein Handling DVDs bewegt, ablegt und brennt. Sie wird im Deutschen Museum zum Einsatz kommen in einem Labor für Schüler.

Funktioniert auch alles soweit und ich bin grad am "Feintuning" der Delphi-Anwendung zu diesem Zweck .

Mein Problem ist:

Da ich die Daten zum Brennen aus einem Netzwerk des Deutschen Museums holen muss und ich derzeit aber bei meiner Firma in Stuttgart bin, habe ich das grad etwas "trivial" gelöst, in dem ich 2 lokale Ordner verwende, einen Brenn- und Datenordner.

Ich habe 2 Funktionen programmiert, DeleteBurnFolder sowie CopyFiles. DeleteBurnFolder hat einzig die Aufgabe den Inhalt des Brennordners zu löschen und CopyFiles kopiert dann die Daten aus dem Datenordner in den Brennordner, so sehen die beiden Funktionen aus:

Delphi-Quellcode:
// löscht Inhalt des Brennordners
function TfBurnstate.DeleteBurnFolder(const AFile: String): Boolean;
var
  ShellInfo: SHFileOpStruct;
begin
  Screen.Cursor := crHourglass;
  btnCancel.Enabled := False;

  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
  with ShellInfo do
    begin
    Wnd := Application.Handle;
    wFunc := fo_Delete;
    pFrom := PChar(AFile+'\*.*'+#0);
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    end;

  Result := ShFileOperation(ShellInfo)=0;

  Screen.Cursor := crDefault;
  btnCancel.Enabled := True;
  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
end;


// Funktion zum Kopieren des Inhalts des Datenordners in den Brennordner
function TfBurnstate.CopyFiles(Burnfolder, Datafolder:String):Boolean;
var ShellInfo: TSHFileOpStructA;
begin
  Screen.Cursor := crHourglass;
  btnCancel.Enabled := False;

  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
  with ShellInfo do
    begin
      wnd := Application.Handle;
      wfunc := FO_COPY;
      pFrom := PChar(Datafolder+'\*.*'+#0);
      pTo := PChar(Burnfolder+#0);
      fFlags := fof_Silent or fof_NoConfirmation;
    end;

  Result := SHFileOperation(ShellInfo) = 0;

  Screen.Cursor := crDefault;
  btnCancel.Enabled := True;
  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
end;
Das kuriose ist: Es funktioniert, aber nicht so richtig ....

Starte bzw. kompiliere ich die Anwendung zum ersten Mal, dann klappts wunderbar, der Brennordner wird gelöscht (ok verstehe ich auch ned ganz, denn ich will nur den Inhalt gelöscht haben) und die Kopierfunktion klappt auch wunderbar. Es wird der Inhalt des Datenordners 1:1 in den Brennordner kopiert .

So nun kommts:
Ist das Programm den Ablauf durch und damit bereit "erneut" eine DVD zu brennen, wiederhole ich den Vorgang wie beim ersten Mal, NUR liefern mir nun beide "SHFileOperation" ein Zugriff verweigert . Ok also scheint ne Freigabe zu fehlen, da ich NeroApi verwende und dort einen Isotree erstelle, dachte ich zunächst, dass dieser die Dateien blockiert, ist aber nicht so. Wenn ich nämlich mein Programmablauf vor dem Brennen stoppe und dann gleich wieder starte, tritt der Fehler ebenso auf.

Dann fällt mir noch was recht nerviges auf:
Das Kopieren scheint trotzdem stattzufinden, NUR wird nun nicht der Inhalt des Datenordners kopiert, sondern einfach der Ordner selbst samt Inhalt.

Das sieht dann so aus:

Erstes Mal kopieren:
Datenordner: "C:\daten\*.*"
Brennordner: "C:\brennen\*.*"

Zweites oder xtes Mal kopieren:
Datenordner: "C:\daten\*.*"
Brennordner: "C:\brennen\daten\*.*"

Also mich nervt das sehr, da es auch meine Arbeit grad beeinflusst und vor allem, weil es eine "Fremdfunktion" ist, ich aber auf sie angewiesen bin. Zwar könnte ich später theoretisch direkt aus dem Netzwerk die Daten zum Brennen holen, aber das wäre dann schon absolute Notlösung

Danke für eure Hilfe

EDIT:
Also ich habe weiter getestet und wenn die Anwendung das erste Mal läuft, klappts mehrfach problemlos, also hatte ich mich geirrt und die Sperrung erfolgt nach dem Brennvorgang mit der NeroAPI. Bei letzterer erstelle ich einen Root-Baum, der auf die Dateien verlinkt, also irgendwie logisch, dass die Dateien gelockt werden. NUR ich habe nun meine Formclose so erweitert, dass alles zur NeroAPI freigegeben wird (vorher im Formdestroy), u. a. auch die IsoTrack und IsoTreeItem Strukturen. Da mein "Brennfenster" sich nach jedem Vorgang schließt, wird dies auch ausgeführt!

Btw. die Sperrung scheint global zu sein, denn ausm Explorer kann ich auch nichts machen .
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#2

Re: Arbeiten mit "ShFileOperation" --> ab 2ten

  Alt 14. Sep 2006, 15:38
Deine Function copyfiles habe ich bei mir ausprobiert. Bestens!

C:\data
C:\brennen
als Parameter funktionieren tadellos: Die Dateien werden rüberkopiert. Der Wurm ist wohl in der Parameterübergabe.

Falls Du dies nicht lösen kannst, zwei Notlösungen:
Delphi-Quellcode:
pFrom := PChar('C:\data\*.*'+#0);
pTo := PChar('C:\brennen'+#0);
(Äh, PChar(Bla) wandelt automatisch in ein nullterminierten String. Weshalb '+#0'?)

oder
Delete(Brennen,4,8) müsste das 'Brennen\' entfernen, so dass C:\brennen\daten zu c:\daten wird.

Funzt was?
[EDIT: Text verschönert und Fehler im Code beseitigt]
Und wohl selbst gelöst...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz