AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SHFileOperation löst Exception aus ?!
Thema durchsuchen
Ansicht
Themen-Optionen

SHFileOperation löst Exception aus ?!

Ein Thema von Orakel-von-Delphi · begonnen am 2. Jun 2005 · letzter Beitrag vom 12. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#1

SHFileOperation löst Exception aus ?!

  Alt 2. Jun 2005, 15:23
Delphi-Quellcode:
.
.

function CopyDir(DirFrom, DirTo: string; Flags : integer = 0; bErrorHandler : boolean = True) : integer;
var
  shellinfo: TSHFileOpStruct;
  FromBuf, ToBuf : Array [0..255] of char;
begin
  If Not DirectoryExists(DirTo) Then
    begin
      Result := -1;
      Exit;
    end;

  Fillchar(shellinfo, Sizeof(shellinfo), 0 );
  FillChar(FromBuf, Sizeof(FromBuf), 0 );
  FillChar(ToBuf, Sizeof(ToBuf), 0 );
  StrPCopy(FromBuf, DirFrom);
  StrPCopy(ToBuf, DirTo);

  with shellinfo do
  begin
    Wnd := 0;
    wFunc := FO_COPY;
    pFrom := @FromBuf;
    pTo := @ToBuf;
    fFlags :=        FOF_SIMPLEPROGRESS or
              FOF_NOCONFIRMATION;
  end;

  Repeat
     try
      Result := SHFileOperation(shellinfo);
      SHFreeNameMappings(Cardinal(shellinfo.hNameMappings));
     except
      Result := GetLastError;
     end;
     if Not bErrorHandler then Exit;
     if Result <> 0 then
       begin
        if MessageDlg(Format('Das Verzeichnis'#13#10#13#10
                           + '''%s'''#13#10#13#10
                           + 'kann nicht nach'#13#10#13#10
                           + '''%s'''#13#10#13#10
                           + 'kopiert werden.'#13#10#13#10
                           + 'Grund: %s'#13#10#13#10
                           + 'Soll der Vorgang erneut versucht werden ?'#13#10#13#10
                           + 'Wenn Sie ''Abbrechen'' drücken, muss das Verzeichnis'#13#10
                           + 'oder die Dateien manuell kopiert werden !', [DirFrom, DirTo, GetFormatErrorMessage(Result)]),
                           mtWarning, [mbAbort, mbRetry], -1) <> mrRetry then
           break;
       end;
  until Result = 0;
end;

.
.

Usage:

.
.
CopyDir(IncludeTrailingPathDelimiter(GetCurrentDir) + DIRDATA + '\Dokumentation\*', sTemp);
.
.
Die Funktion CopyDir wird im Programm an verschieden Stellen verwendet. Beim Kopiervorgang eines größeren Verzeichnisses (ca. 6,5 MB in 162 Dateien) löst SHFileOperation hin und wieder eine Exception aus. Entweder Fehler 7 (The storage control blocks were destroyed) oder der Thread in dem der Vorgang abläuft stürzt ganz ab ohne einfangen der Exception. Alleine das wundert mich schon, da ein try .. except Block um die Funktion gebaut ist.

http://bugtrack.sporleder.de/image/installer_7.GIF

Weiß jemand Rat ? Googlen hat mir jedenfalls nicht geholfen
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#2

msi-Installer ?!

  Alt 3. Jun 2005, 18:32
Kann es evtl. sein, dass das Problem von dem msi-Installer verursacht wird ? Mein Programm startet nämlich 2 Installationsprogramme mit ShellExecAndWait bevor dieser Fehler auftritt. Wenn man mein angebrochenen Install dann erneut startet, haben die beiden msi-Installer nichts mehr zu installieren und mein Programm läuft Fehler durch.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: SHFileOperation löst Exception aus ?!

  Alt 3. Jun 2005, 18:33
Tja, probier es aus.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: SHFileOperation löst Exception aus ?!

  Alt 3. Jun 2005, 22:27
Moin Orakel,

nur zur Info:
Der MSI-Installer kann zwar theoretisch mehrmals gleichzeitig laufen, da es aber Tabllen gibt, die nicht von mehreren Instanzen gleichzeitig genutzt werden können, kann es leicht zu Problemen kommen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#5

Re: SHFileOperation löst Exception aus ?!

  Alt 11. Okt 2005, 08:14
Ich habe jetzt alle Aufrufe mit Synchronize in den Hauptthread verlegt und die Aufrufe des MSI-Installers testweise ausgeschaltet. Der Fehler tritt immer noch auf !!! Was kann den bloß falsch sein ??? Das Problem tritt auf allen Computern auf, die ich zur Verfügung habe (Win2000, WinXP) und ist unabhängig von der Größe des verfügbaren Speichers.

Wie kann man dieses Problem lösen ??? Sieht schlecht aus, wenn der Kunde sein neu erworbenes Produkt installiert und gleich die oben genannte Fehlermeldung auftritt ...
Michael
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: SHFileOperation löst Exception aus ?!

  Alt 11. Okt 2005, 09:41
Also mir gefällt das Füllen von TSHFileOpStruct nicht.
Du hast
1.) die Struktur nicht mit 0 vorbelegt
2.) feste Puffer benutzt, die sehr leicht überschrieben werden können. => Zerstörung des Stacks
Besser so:
Delphi-Quellcode:
FillChar(shellinfo, SizeOf(shellinfo), #0); // zuerst mit #0 füllen

DirFrom := DirFrom+#0+#0
DirTo := DirTo+#0#0;
  
with shellinfo do
begin
  Wnd := GetDesktopWindow;
  wFunc := FO_COPY;
  pFrom := PChar(DirFrom);
  pTo := PChar(DirTo);
  fFlags := FOF_SIMPLEPROGRESS or FOF_NOCONFIRMATION;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#7

Re: SHFileOperation löst Exception aus ?!

  Alt 12. Okt 2005, 10:45
Danke für den Tipp, aber

der Buffer wurde bereits initialisiert

Fillchar(shellinfo, Sizeof(shellinfo), 0 ); und die statischen Variablen habe ich entfernt

Delphi-Quellcode:
  with shellinfo do
  begin
    Wnd := 0;
    wFunc := FO_COPY;
    pFrom := PChar(DirFrom + #0 + #0);
    pTo := PChar(DirTo + #0 + #0);
    fFlags := FOF_SIMPLEPROGRESS or
                   FOF_NOCONFIRMATION;

         .
         .
Leider ohne Erfolg:

http://bugtrack.sporleder.de/image/ERROR_7.jpg

Hast sonst noch jemand eine Idee ???
Michael
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: SHFileOperation löst Exception aus ?!

  Alt 12. Okt 2005, 11:16
Statische Variablen gibt es in Delphi nicht, meint ihr Literale oder was meint ihr?

An dieser Stelle solltest du definitiv einen String mit deinen Daten vorbelegen (wie oben gesehen) und dann den String bei pFrom und pTo in folgender Form zuweisen.
Delphi-Quellcode:
  with shellinfo do
  begin
    Wnd := 0;
    wFunc := FO_COPY;
    pFrom := @DirFrom[1];
    pTo := @DirTo[1];
    fFlags := FOF_SIMPLEPROGRESS or
                   FOF_NOCONFIRMATION;

         .
         .
Ansonsten werde ich mal kurz drüberschauen.

Nachtrag:
Was soll das denn?
Delphi-Quellcode:
  FillChar(FromBuf, Sizeof(FromBuf), 0 );
  FillChar(ToBuf, Sizeof(ToBuf), 0 );
Bei integralen Datentypen weist man immer Werte zu, wozu nullst du denn einen Pointer aus? Oder was ist FromBuf und ToBuf? Wenn es Strings sind, ist es komplett falsch.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: SHFileOperation löst Exception aus ?!

  Alt 12. Okt 2005, 11:33
Hi,

mir fällt dieser Ausdruck bei Dir auf:
SHFreeNameMappings(Cardinal(shellinfo.hNameMappings)); Also ich glaube nicht, dass Du diesen verwenden muss, wenn Du keine Name Mappings verwendest...

Ansonsten kannst Du das kopieren ja mal mit meinerSHFileOperation Wrapper Unit ausprobieren.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Orakel-von-Delphi
Orakel-von-Delphi

Registriert seit: 27. Jan 2004
Ort: Mittelhessen
45 Beiträge
 
Delphi 2007 Professional
 
#10

Re: SHFileOperation löst Exception aus ?!

  Alt 12. Okt 2005, 11:45
@Olli:

FromBuf und ToBuf ist in der ursprünglichen Variante verwendet worden (array [0..255] of char).

@mirage228:

Ich weiß, dass ich keine Mappings verwende. War auch nur ein Versuch, aber der Fehler tritt mit oder ohne SHFreeNameMappings auf
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:02 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