AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

.exe soll Kopie von sich selbst erstellen

Ein Thema von Viktorii · begonnen am 23. Mär 2011 · letzter Beitrag vom 23. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

.exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:26
Delphi-Version: XE
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?
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#2

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:31
Was sagt denn SysErrorMessage((GetLastError))?
[edit]
Assert(GetLastError()=0, SysErrorMessage(GetLastError()) nach jeder zeile, die die API aufruft.
[/edit]

Geändert von WM_CLOSE (23. Mär 2011 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#3

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:41
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:
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 Assert(FileHandle <> INVALID_HANDLE_VALUE, SysErrorMessage(GetLastError); .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Mär 2011 um 13:46 Uhr)
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#4

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:43
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...

Geändert von Viktorii (23. Mär 2011 um 13:49 Uhr)
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:48
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 13:48
Das hilft soweit, daß du dir jetzt mal den Puffer anschaust.
Delphi-Quellcode:
FileRead(FileHandle, Buffer^, FileLength);
FileWrite(FileHandle, Buffer, FileLength);

. . . . . . . . . . . . . ^^^ und zwar hier
PS: PChar ... warum nicht Pointer?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#7

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 14:14
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#8

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 15:00
Hast du dir meinen Post ganz genau angesehn?
Was ist der Unterschied zwischen den beiden Befehlen? (abgesehn vom Funktionsnamen)

@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 17:12
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!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: .exe soll Kopie von sich selbst erstellen

  Alt 23. Mär 2011, 17:24
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 09:10 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