Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei an eine Exe anhängen (https://www.delphipraxis.net/109100-datei-eine-exe-anhaengen.html)

Masteric 24. Feb 2008 14:56


Datei an eine Exe anhängen
 
Hi, ich wollte mit einem Code aus dem Delphi-Treff eine Datei 'temp.cfg' an meine Exe anhägen, nur leider kommt immer eine Fehler Meldung. Hier erstmal der Code:
Delphi-Quellcode:
function Save(ExeSize:integer; Mem:TMemo):boolean;
var f2: file;
  aHdl: Integer;
  gelesen: longInt;
  aBuf: Array[1..40000] of byte;
  Groesse: LongInt;
begin
  Mem.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'temp.cfg');
  AssignFile(f2,ExtractFilePath(Application.ExeName)+ExtractFileName(Application.ExeName));
  Reset(f2, 1);// Hier kommt ein E/A-Fehler 32 das ist ein EINOUTERROR.
  Groesse:=FileSize(f2);
  CloseFile(f2);
  aHdl:=FileOpen(ExtractFileName(Application.ExeName),fmOpenReadWrite);
  FileSeek(aHdl,Groesse,0);
  AssignFile(f2,ExtractFilePath(Application.ExeName)+'temp.cfg');
  Reset(f2,1);
  while not Eof(f2) do
  begin
    BlockRead(f2,abuf,sizeof(abuf),gelesen);
    FileWrite(aHdl,abuf,gelesen);
  end;
  CloseFile(f2);
  DeleteFile('temp.cfg');
end;
Ich habe bis jetzt nichts passendes gefunden, ahbe aber eine Vermutung...

Das hier ist die Function, mit der ich die Datei wieder aus der exe bekomme, die wird vor der oben ausgeführt,
meine Vermutung ist, dass es daran liegt, da es ohne die zum Lesen wunderbar funktioniert..

Delphi-Quellcode:
function Load(ExeSize:integer; Mem:TMemo):boolean;
var aHdl:Integer;
  aBuf:Array[1..40000] of byte;
  Gelesen: LongInt;
  f: file;
begin
  aHdl:=FileOpen(Application.ExeName, fmShareDenyNone or fmOpenRead);
  FileSeek(aHdl, ExeSize, 0);
  AssignFile(f, ExtractFilePath(Application.ExeName)+'temp.cfg');
  ReWrite(f, 1);
  Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  while Gelesen>0 do
  begin
    BlockWrite(f,aBuf,Gelesen);
    Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  end;
  CloseFile(f);
  FileClose(aHdl);
  Mem.Lines.Loadfromfile(ExtractFilePath(Application.ExeName)+'temp.cfg');
end;
Hoffe mal, dass man dadurch kommt.

Masteric

API 24. Feb 2008 15:12

Re: Datei an eine Exe anhängen
 
Ich habe mir deinen Code nicht angeschaut aber ich empfehle dir den TExtraResManager

Zitat:

Mit dieser Komponente kann man nachträglich an bereits kompilierte Exe-Dateien sogenannte "Extra-Resourcen" anhängen und natürlich auch wieder auslesen. Bei diesen Extra-Resourcen handelt es sich allerdings nicht um herkömmliche Resourcen, die mit jedem Resource-Viewer erkannt werden können, sondern können nur mit Hilfe dieser Komponente erstellt und ausgelesen werden. Diese Komponente kann einem die Entwicklung von SFX-Archiven oder Setup- und Update-Programmen erheblich erleichtern! Die Komponente enthält auch eine Hilfe-Datei!

Hinweis: Diese Komponente enthält und verwendet Teile des DEC von Hagen Reddmann.

Muetze1 24. Feb 2008 15:14

Re: Datei an eine Exe anhängen
 
Zitat:

Zitat von Masteric
Hi, ich wollte mit einem Code aus dem Delphi-Treff eine Datei 'temp.cfg' an meine Exe anhägen, nur leider kommt immer eine Fehler Meldung.

Verrätst du uns noch die Fehlermeldung?

Masteric 24. Feb 2008 15:33

Re: Datei an eine Exe anhängen
 
Es ist ein ein E/A-Fehler 32 das ist ein EINOUTERROR, hatte das schon im ersten Quelltext mit der stelle wo er auftriit angegeben :-D

Masteric

Muetze1 24. Feb 2008 15:38

Re: Datei an eine Exe anhängen
 
Mit anderen Worten: er kann die Datei nicht öffnen. Ich würde vermuten, dass ein anderes Programm auf die Datei zugreift oder die Datei schreibgeschützt ist oder erst gar nicht existiert.

Masteric 24. Feb 2008 15:52

Re: Datei an eine Exe anhängen
 
aber warum kommt der Fehler bei dem Reset? :gruebel:

TurboMartin 24. Feb 2008 16:03

Re: Datei an eine Exe anhängen
 
Ich würde meinen, es kommt eine Zeile vorher.
Du versuchst an eine geöffnete Datei etwas anzuhängen -> das geht nicht. :mrgreen:

omata 24. Feb 2008 16:11

Re: Datei an eine Exe anhängen
 
Zitat:

Zitat von Masteric
aber warum kommt der Fehler bei dem Reset? :gruebel:

Ganz einfach: Das AssignFile erstellt nur einen Dateihandle, das geht immer. Wie die Datei geöffnet werden soll gibts du mit reset an. Erst dann wird die Datei geöffnet und deshalb knallt es dann.

Damit das Handle auch wieder freigegeben wird solltest du try...finally benutzen.
Delphi-Quellcode:
try
  AssignFile(Handle, 'Dateiname');
  Reset(Handle);
  :
  :
finally
  CloseFile(Handle);
end;
Edit: Reset öffnet normalerweise zum Lesen & Schreiben! Setze mal vor AssignFile FileMode auf fmOpenRead für nur Lesen. (das geht natürlich nur für deine Load-Methode. Schreiben ist nicht, wenn die Anwendung läuft!)

Gruss
Thorsten

Masteric 24. Feb 2008 16:45

Re: Datei an eine Exe anhängen
 
das dachte ich mir schon, dass ich nichts in die exe schreiben kann... dafür war die Function zwar eigenlich gedacht, aber da kann man nichts machen

omata 24. Feb 2008 16:56

Re: Datei an eine Exe anhängen
 
Naja, du könntest deine Schreibfunktionen auch auslagern in eine zweite Anwendung. In der Hauptanwendung startest du dann deine zweite Anwendung und beendest die Erste. Dann kann die zweite Anwendung die Änderungen schreiben, startet wieder die Hauptanwendung und beendet sich. Die zweite Anwendung brauch dabei nur eine Konsolenanwendung zu sein.

Ok, war nur mal kurz laut gedacht...

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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