![]() |
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 ;-)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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