Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   .exe soll Kopie von sich selbst erstellen (https://www.delphipraxis.net/159332-exe-soll-kopie-von-sich-selbst-erstellen.html)

Viktorii 23. Mär 2011 13:26

Delphi-Version: XE

.exe soll Kopie von sich selbst erstellen
 
Moin.

Wie der Titel schon sagt, soll eine .exe eine Kopie von sich selbst erstellen. Das ist mein Lösungsansatz:
Delphi-Quellcode:
  //--- Datei öffnen und einlesen
  FileHandle := FileOpen(Application.ExeName, fmShareDenyNone);
  FileLength := FileSeek(FileHandle,0,2);
  FileSeek(FileHandle,0,0);
  Buffer := PChar(AllocMem(FileLength + 1));
  BytesRead := FileRead(FileHandle, Buffer^, FileLength);
  FileClose(FileHandle);

  //--- Neue Datei schreiben
  FileHandle := FileCreate(ExtractFilePath(Application.ExeName) + '\Copy.exe', fmCreate);
  BytesWritten := FileWrite(FileHandle, Buffer, FileLength);
  FileClose(FileHandle);
Es wird zwar eine Datei erstellt, aber diese ist 0 Byte groß.

Wenn ich mir den Inhalt meiner lokalen Variablen anschauen, sehe ich, dass FileWrite schief geht:
Code:
Name des Ausdrucks   Wert
BytesRead   5762995
FileLength   5762995
BytesWritten   -1
Die Frage ist nur warum?

WM_CLOSE 23. Mär 2011 13:31

AW: .exe soll Kopie von sich selbst erstellen
 
Was sagt denn SysErrorMessage((GetLastError))?
[edit]
Delphi-Quellcode:
Assert(GetLastError()=0, SysErrorMessage(GetLastError())
nach jeder zeile, die die API aufruft.
[/edit]

himitsu 23. Mär 2011 13:41

AW: .exe soll Kopie von sich selbst erstellen
 
OpenFile, FileSeek, FileCreate, ReadFile und WriteFile liefern Fehlerwerte als Result, wie z.B. INVALID_HANDLE_VALUE und INVALID_SET_FILE_POINTER
und GetLastError funktioniert da auch.


PS: MSDN-Library durchsuchenCopyFile oder ein schöner TFileStream?


Zitat:

Delphi-Quellcode:
Assert(GetLatError()=0, SysErrorMessage(GetLastError());

Nein.
GetLastError gibt den "letzten Fehlercode" zurück.
Es sagt nicht, ob der "letzte Befehl" erfolgreich war.
Also wenn schon, dann so
Delphi-Quellcode:
Assert(FileHandle <> INVALID_HANDLE_VALUE, SysErrorMessage(GetLastError);
.

Viktorii 23. Mär 2011 13:43

AW: .exe soll Kopie von sich selbst erstellen
 
Er meldet das hier

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Update.exe ist eine Exception der Klasse EAssertionFailed mit der Meldung 'Der angegebene Benutzerpuffer ist für den angeforderten Vorgang nicht zulässig (D:\Eigene Dateien\RAD Studio\Projekte\Update\Controller\Updater.pas, Zeile 68)' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Hilft das weiter? Mir hilft es nicht weiter... :(


@himitsu: CopyFile funktioniert gut und ist mit einer Zeile auch einfacher...

WM_CLOSE 23. Mär 2011 13:48

AW: .exe soll Kopie von sich selbst erstellen
 
Geht es denn mit einer andern Datei?
Ich vemute nämlich, dass sich eine exe datei nicht selbt lesen oder schreiben kann.
Vielleicht mal als readonly öffnen.

PS:welches ist den die Zeile 68?

himitsu 23. Mär 2011 13:48

AW: .exe soll Kopie von sich selbst erstellen
 
Das hilft soweit, daß du dir jetzt mal den Puffer anschaust. :wink:
Delphi-Quellcode:
FileRead(FileHandle, Buffer^, FileLength);
FileWrite(FileHandle, Buffer, FileLength);

. . . . . . . . . . . . . ^^^ und zwar hier
PS: PChar ... warum nicht Pointer?

Viktorii 23. Mär 2011 14:14

AW: .exe soll Kopie von sich selbst erstellen
 
Zeile 68 ist das assert nach FileWrite...

Das lesen der Datei scheint zu funktionieren. In dem Buffer sind auch die richtigen Daten (habe die ersten paar Bytes überflogen).

@himitsu: PChar, weil Delphi mir das per Refactoring vorgeschlagen hat. Habe ich nicht drüber nachgedacht und einfach weiter gedrückt... Pointer bringt aber keine Änderung...

himitsu 23. Mär 2011 15:00

AW: .exe soll Kopie von sich selbst erstellen
 
Hast du dir meinen Post ganz genau angesehn?
Was ist der Unterschied zwischen den beiden Befehlen? (abgesehn vom Funktionsnamen)

Zitat:

Zitat von Viktorii (Beitrag 1090497)
@himitsu: PChar, weil Delphi mir das per Refactoring vorgeschlagen hat. Habe ich nicht drüber nachgedacht und einfach weiter gedrückt... Pointer bringt aber keine Änderung...

Du hast da eher ein Byte-Array, mit der Länge von FileLength Bytes.
PChar ist bei dir aber ein WideChar-Array, also 2 Byte pro Zeichen.
Und ja, von der Funktion deines Programms her ist es vollkommen egal ... es ist halt ein logisches Problemchen, wo Pointer oder PByte oder notfalls PAnsiChar logischer wären.

Aphton 23. Mär 2011 17:12

AW: .exe soll Kopie von sich selbst erstellen
 
ExtractFilePath liefert einen String mit "\" am Schluss, deshalb gehört da kein + '\..' hin.
Ich schätze mal, es liegt daran!
Schau dir mal den Inhalt der Variable FileHandle an!
Dürfte nämlich den Wert INVALID_HANDLE_VALUE haben!

p80286 23. Mär 2011 17:24

AW: .exe soll Kopie von sich selbst erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1090505)
Hast du dir meinen Post ganz genau angesehn?
Was ist der Unterschied zwischen den beiden Befehlen? (abgesehn vom Funktionsnamen)

Wer lesen kann ist klar im Vorteil!
Ich dachte schon Du hättest Dich vertippt.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 2  1 2      

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