![]() |
CopyFileEx und Codeoptimierung XE5
Moin zusammen,
ich benutze DelphiXE5. CopyFileEx funktioniert da nicht wenn ich Codeoptimierung aktiv habe. :shock: D.h. es kommt der Fehler "Die Anforderung wurde abgebrochen" Delphi-Bug oder gibts dafür eine andere Erklärung? Danke |
AW: CopyFileEx und Codeoptimierung XE5
Die irrsinnige Menge des von Dir geposteten Sourcecodes hat mich fast zur Verzweiflung getrieben :roll:
|
AW: CopyFileEx und Codeoptimierung XE5
Wozu sourcecode? Der ist ja kaum falsch wenn es ohne Optimierung funktioniert.
Ausserdem ist der älter, d.h. in 2006 gabs auch mit Optimierung keine Fehler.
Delphi-Quellcode:
[B]
function TFileCopier.DoFolderFiles( const ASourcePath, ATargetPath: string; const Op: TFolderOp): Int64; var StrName, MySearchPath, MyTargetPath, MySourcePath: string; FindRec: TSearchRec; i: Integer; Cancelled: Boolean; Attrs: integer; CopyIt: boolean; begin Result := 0; Cancelled := False; MyTargetPath := AddBackSlash(ATargetPath); MySourcePath := AddBackSlash(ASourcePath); MySearchPath := AddBackSlash(ASourcePath) + '*.*'; i := FindFirst(MySearchPath, 0 , FindRec); try while (i = 0) and (Result <> -1) do begin try case op of foCopy: begin StrName := MySourcePath + FindRec.Name; CopyIt:= CopyAll or (FindRec.Attr and faArchive = faArchive); if CopyIt then begin //Cancelled:= false; if CopyFileEx(PWideChar(StrName), PWideChar(MyTargetPath + FindRec.Name), @fCallBack, Pointer(fHandle), @Cancelled, 0) then begin Attrs := FileGetAttr(StrName); FileSetAttr(StrName, Attrs and not faArchive); inc(Result); inc(fCopyCount); TUtils.WriteLogFile(eData, StrName + ' saved to ' + MyTargetPath + FindRec.Name); Sleep(50); end else begin Result := -1; TUtils.WriteLogFile(eError, StrName + ' not saved' + #13#10 + SysErrorMessage (GetLastError)); end; end; end; foCount: begin Inc(Result); Inc(fFileCount); end; foSize: begin Result := Result + FindRec.Size; fFileSize := fFileSize + FindRec.Size; end; end; // case except Result := -1; end; i := FindNext(FindRec); end; finally FindClose(FindRec); end; end; [/B] |
AW: CopyFileEx und Codeoptimierung XE5
Diese Zuweisungen werden wegoptimiert, weil die Variable aus Sicht des Compilers später nicht mehr angesprochen wird:
Delphi-Quellcode:
Wenn Du das Flag später nochmal abfragst könnte es gehen.
Cancelled:= false;
|
AW: CopyFileEx und Codeoptimierung XE5
Die Zeile gehört eigentlich nicht rein, war nur um das zu finden.
Das setzt man auf true um während des kopierens abzubrechen. So weit kommt man aber erst garnicht. |
AW: CopyFileEx und Codeoptimierung XE5
Liegt der Fehler evtl. im Callback?
|
AW: CopyFileEx und Codeoptimierung XE5
Laut API-Dokumentation ist aber doch genau das der Grund wenn er mit
Delphi-Quellcode:
rausgeht.
ERROR_REQUEST_ABORTED
Der andere wäre, wenn dein
Delphi-Quellcode:
fCallBack
Delphi-Quellcode:
zurückgibt, aber über das Ding wissen wir nichts.
PROGRESS_STOP
|
AW: CopyFileEx und Codeoptimierung XE5
Nein, ohne callback(nil) das gleiche Problem.
Am Cancel liegt das nicht, das war vorher auch dort nicht drin, brauch ich auch nicht. Die Funktion wird sofort abgebrochen. Aber eben nur wenn Optimierung an ist. pbCancel [in, optional] If this flag is set to TRUE during the copy operation, the operation is canceled. Otherwise, the copy operation will continue to completion. Callback sendet nur Messages, aber wie gesagt ohne Callback gehts auch nicht.
Delphi-Quellcode:
function CopyFileProgress(TotalFileSize, TotalBytesTransferred, StreamSize,
StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile: DWORD; lpData: Pointer): DWORD; stdcall; begin if CancelCopy = True then begin SendMessage(THandle(lpData), CEXM_CANCEL, 0, 0); result:= PROGRESS_CANCEL; exit; end; case dwCallbackReason of CALLBACK_CHUNK_FINISHED: begin SendMessage(THandle(lpData), CEXM_CONTINUE, TotalBytesTransferred.LowPart, TotalBytesTransferred.HighPart); result:= PROGRESS_CONTINUE; end; CALLBACK_STREAM_SWITCH: begin SendMessage(THandle(lpData), CEXM_MAXBYTES, TotalFileSize.LowPart, TotalFileSize.HighPart); result:= PROGRESS_CONTINUE; end; else result:= PROGRESS_CONTINUE; end; end; |
AW: CopyFileEx und Codeoptimierung XE5
Einen Fehle seh ich auf die Schnelle auch noch nicht,
aber im Notfall könntest du ja die Optimierung für die eine einfach Funktion deaktivieren. |
AW: CopyFileEx und Codeoptimierung XE5
Du meinst also, ein reines
Delphi-Quellcode:
fliegt schon raus?
if not CopyFileEx(
'd:\Neues Textdokument.txt', 'd:\Neues Textdokument (Kopie).txt', nil, nil, nil, COPY_FILE_NO_BUFFERING ) then RaiseLastOSError(); |
AW: CopyFileEx und Codeoptimierung XE5
Deine Version geht.
Das fliegt raus:
Delphi-Quellcode:
Jetzt komischerweise unabhängig von Code-Optimierung, also immer.
var
Cancelled: Boolean; begin if not CopyFileEx('d:\Neues Textdokument.txt', 'd:\Neues Textdokument (Kopie).txt', nil, nil, @Cancelled, COPY_FILE_NO_BUFFERING ) then RaiseLastOSError(); :o Im ursprünglichen Programm muss das @Cancelled raus und nil rein dann gehts auch dort. Nur Warum? |
AW: CopyFileEx und Codeoptimierung XE5
Die lokale Variable
Delphi-Quellcode:
wird nicht implizit initialisiert. Wenn da zufällig
Cancelled
Delphi-Quellcode:
drin steht, würde das
true
Delphi-Quellcode:
abbrechen. Selbst wenn du die vorher auf
CopyFileEx
Delphi-Quellcode:
setzt, wird der Compiler den Aufruf wegoptimieren, da die Variable später nicht ausgelesen wird. Offenbar wird die Übergabe an
false
Delphi-Quellcode:
über den Adressoperator nicht als Verwendung angesehen.
CopyFileEx
Versuch doch mal einfach nach dem
Delphi-Quellcode:
noch eine Abfrage auf
CopyFileEx
Delphi-Quellcode:
zu machen (natürlich so, daß die nicht auch noch wegoptimiert wird).
Cancelled
|
AW: CopyFileEx und Codeoptimierung XE5
Vielleicht würde
Delphi-Quellcode:
statt
Addr(Cancelled)
Delphi-Quellcode:
einen Unterschied bzgl. Optimierung machen? (Ich rate nur wild)
@Cancelled
|
AW: CopyFileEx und Codeoptimierung XE5
Ob und welches
Delphi-Quellcode:
wegoptimiert wurde, müsste man nach dem Compilieren eigentlich sehen (die blauen Pünktchen) und auch der Debugger würde die Befehle entsprechend überspringen.
Cancelled := False;
Zitat:
Oder optimiert er
Delphi-Quellcode:
immernoch nicht weg? :angel:
if Cancelled then ;
|
AW: CopyFileEx und Codeoptimierung XE5
Hilft beides nicht.
Cancelled ist davor und danach false und CopyFileEx fliegt raus.
Delphi-Quellcode:
var
Cancelled: Boolean; begin Cancelled:= false; if not CopyFileEx('d:\Neues Textdokument.txt', 'd:\Neues Textdokument (Kopie).txt', nil, nil, @Cancelled, COPY_FILE_NO_BUFFERING ) then RaiseLastOSError(); if Cancelled then beep; |
AW: CopyFileEx und Codeoptimierung XE5
Delphi-Quellcode:
if CompilerVer > D2009 then LongBool <> Boolean;
|
AW: CopyFileEx und Codeoptimierung XE5
War Boolean nicht immer schon ByteBool?
|
AW: CopyFileEx und Codeoptimierung XE5
Ja ;) Aber in diesem Fall liegt es an den Variablen. Bei ausgeschalteter Optimierung belegt wohl das boolean eine Registerbreite. Ist sie angeschaltet dann wird nur noch ein Byte belegt. Jetzt wird ein Pointer auf die Adresse des boolean an die CopyFileEx übergeben. Dieses ist der festen Überzeugung das es 4 byte lesen muss und darf. Damit hängt der Inhalt aus Sicht der WinApi davon ab, was dahinter gerade so zufällig an den nächsten 3 byte im Speicher steht.
|
AW: CopyFileEx und Codeoptimierung XE5
Danke, das wars. Mit LongBool gehts.
|
AW: CopyFileEx und Codeoptimierung XE5
Zitat:
(kleiner kann ich im moment nicht prüfen ;-)) |
AW: CopyFileEx und Codeoptimierung XE5
Die Erklärung ist auch unter
![]() ![]()
Delphi-Quellcode:
ist vom Typ ein
pbCancel
Delphi-Quellcode:
, der wiederum ein Pointer auf ein
LPBOOL
Delphi-Quellcode:
ist und das ist vom Typ ein
BOOL
Delphi-Quellcode:
.
INT
Ein
Delphi-Quellcode:
ist ein
BOOLEAN
Delphi-Quellcode:
.
BYTE
Ich habe aber auch erst jetzt nachgesehen ;) |
AW: CopyFileEx und Codeoptimierung XE5
Alter Schwede, den Fehler habe ich dann aber auch schon ein paar mal gemacht! :shock:
Bislang ist mir noch nichts um die Ohren geflogen... |
AW: CopyFileEx und Codeoptimierung XE5
Bei LPBOOL böte sich der generische Typ BOOL an (in Windows.pas als LongBool deklariert), dann sollte das doch automatisch passen, oder?
|
AW: CopyFileEx und Codeoptimierung XE5
Zitat:
|
AW: CopyFileEx und Codeoptimierung XE5
Ja eben :)
|
AW: CopyFileEx und Codeoptimierung XE5
Das perverse war ja dass es bei mir ohne Codeoptimierung funktioniert hat. :shock:
|
AW: CopyFileEx und Codeoptimierung XE5
Zitat:
|
AW: CopyFileEx und Codeoptimierung XE5
Random Bug :lol:
Na gut, habs grad noch überlebt :stupid: :cheers: |
AW: CopyFileEx und Codeoptimierung XE5
Ich finde es ja praktisch, daß inzwischen immer mehr dieser APIs entweder direkt mit einem VAR-Parameter deklariert wurden, oder dass es davon eine entsprechende überladene Version gibt.
Dort schlägt dann die Typprüfung des Compilers zu und der Fehler wird schnell entdeckt. |
AW: CopyFileEx und Codeoptimierung XE5
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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