![]() |
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:
Es wird zwar eine Datei erstellt, aber diese ist 0 Byte groß.
//--- 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); Wenn ich mir den Inhalt meiner lokalen Variablen anschauen, sehe ich, dass FileWrite schief geht:
Code:
Die Frage ist nur warum?
Name des Ausdrucks Wert
BytesRead 5762995 FileLength 5762995 BytesWritten -1 |
AW: .exe soll Kopie von sich selbst erstellen
Was sagt denn SysErrorMessage((GetLastError))?
[edit]
Delphi-Quellcode:
nach jeder zeile, die die API aufruft.
Assert(GetLastError()=0, SysErrorMessage(GetLastError())
[/edit] |
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: ![]() Zitat:
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);
|
AW: .exe soll Kopie von sich selbst erstellen
Er meldet das hier
Zitat:
@himitsu: CopyFile funktioniert gut und ist mit einer Zeile auch einfacher... |
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? |
AW: .exe soll Kopie von sich selbst erstellen
Das hilft soweit, daß du dir jetzt mal den Puffer anschaust. :wink:
Delphi-Quellcode:
PS: PChar ... warum nicht Pointer?
FileRead(FileHandle, Buffer^, FileLength);
FileWrite(FileHandle, Buffer, FileLength); . . . . . . . . . . . . . ^^^ und zwar hier |
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... |
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:
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. |
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! |
AW: .exe soll Kopie von sich selbst erstellen
Zitat:
Ich dachte schon Du hättest Dich vertippt. Gruß K-H |
AW: .exe soll Kopie von sich selbst erstellen
Hallo Viktorii...
gibt es einen besonderen Grund warum du nicht das einfache CopyFile (wie himi schon erwähnte) benutzt ? Ich finde du quälst dich unnötig...
Delphi-Quellcode:
:hi:
CopyFile(PChar(Pfad1 + Datei.exe),PChar(Pfad2 + Datei.exe),false);
|
AW: .exe soll Kopie von sich selbst erstellen
Also, mindestens seit D2010 gibt es auch die Unit IOUtils mit
Delphi-Quellcode:
(ja, das ist eine Klassenmethode und wird genau so aufgerufen)
TFile.DoCopy(Quelldatei, Zieldatei, False);
PS: Für ![]() ![]() ![]() Aber CopyFile haben Borland, Codegear und auch noch Embarcadero einfach vergessen. :wall: Aber Emba hat ja nun endlich einen schönen Ersatz eingeührt. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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