Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datei Binder/Joiner (https://www.delphipraxis.net/60433-datei-binder-joiner.html)

CodenameCookie 6. Jan 2006 21:22


Datei Binder/Joiner
 
Hallöchen Community,

suche eine möglichkeit oder sogar vielleicht ein sourcecode (example) 2 Dateien ineinander zu verschmelzen (binden) . Habe mich schoneinmal umgesehen , es gab das Thema schoneinmal . Es soll kein Trojaner werden !

Vielen Dank im Vorraus

Grüsse CC :wink: :bounce1:

ErazerZ 6. Jan 2006 21:28

Re: Datei Binder/Joiner
 
Stub.dpr
Delphi-Quellcode:
{A very Lite stub for extraction and execution of multiple files.
 Author: TM
}
program Stub;

uses
  Windows, ShellApi;

function EnumNamesFunc(hModule:THANDLE; lpType, lpName:PChar; lParam:DWORD):BOOL; stdcall;
var
  Info, FH, BW:DWORD;
begin
  Result:= True;
  Info:= FindResource(0, lpName, lpType);
  FH:= CreateFile(PChar('C:\'+lpName), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  WriteFile(FH, LockResource(LoadResource(0, Info))^, SizeOfResource(0, Info), BW, nil);
  CloseHandle(FH);
  ShellExecute(0, 'OPEN', PChar('C:\'+lpName), '', '', 0);
end;

begin
  EnumResourceNames(0, RT_RCDATA, @EnumNamesFunc, 0);
end.
Binder:
Delphi-Quellcode:
{Ex Binder v0.1
 Just an example of using Resources to bind multiple files into
 a single executable.
 Author: TM
}

unit untMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TfrmMain = class(TForm)
    BtnOpen1: TButton;
    Bevel1: TBevel;
    BtnBuild: TButton;
    OD: TOpenDialog;
    LstFile: TListBox;
    procedure BtnOpen1Click(Sender: TObject);
    procedure BtnBuildClick(Sender: TObject);
    procedure LstFileDblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.BtnOpen1Click(Sender: TObject);
begin
  if OD.Execute then
    LstFile.Items.Add(OD.FileName);
end;

procedure TfrmMain.BtnBuildClick(Sender: TObject);
var
  I:Integer;
  H, Size, FH, BR:DWORD;
  Local:String;
  Buf:Pointer;
begin
  Local:= ExtractFilePath(ParamStr(0));
  CopyFile(PChar(Local+'Stub\Stub.exe'), PChar(Local+'Out.exe'), False);
  H:= BeginUpdateResource(PChar(Local+'Out.exe'), True);
  for I:= 0 to LstFile.Items.Count-1 do begin
    FH:= CreateFile(PChar(LstFile.Items[I]), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Size:= GetFileSize(FH, nil);
    GetMem(Buf, Size);
    ReadFile(FH, Buf^, Size, BR, nil);
    CloseHandle(FH);
    UpdateResource(H, RT_RCDATA, PChar(UpperCase(ExtractFileName(LstFile.Items[I]))), MAKEWord(LANG_NEUTRAL, SUBLANG_NEUTRAL), Buf, Size);
    FreeMem(Buf);
  end;
  EndUpdateResource(H, False);
end;

procedure TfrmMain.LstFileDblClick(Sender: TObject);
begin
  if LstFile.ItemIndex <> -1 then
    LstFile.Items.Delete(LstFile.ItemIndex);
end;

end.

DGL-luke 6. Jan 2006 21:37

Re: Datei Binder/Joiner
 
:shock: :shock: was ist das für ein monstercode?

Also einfach aneinanderhängen?

Delphi-Quellcode:
var s1,s2: TStream;
begin
  s1 := TFileStream.Create('C:\test\1.txt',fmOpenWrite);
  s2 := TFileStream.Create('C:\test\2.txt',fmOpenRead);

  s1.Position := s1.Size;
  s2.Position := 0;
  s1.CopyFrom(s2,s2.Size);
end;

Luckie 6. Jan 2006 21:47

Re: Datei Binder/Joiner
 
Zitat:

Zitat von DGL-luke
Also einfach aneinanderhängen?

Exakt. Er hat nur ein einfaches selbstentpackendes Archiv raus gemacht. Willst du die dateien wieder trennen, sollte man sich noch merken, wo eine Datei anfängt und die andere aufhört. ;)

ErazerZ 6. Jan 2006 21:48

Re: Datei Binder/Joiner
 
monstercode?
das sind stub(7 Zeilen..) + builder, und stub kann unbegrenzt dateien drinnen haben ..
btw. code ist nicht von mir, sondern von TM

DGL-luke 6. Jan 2006 21:50

Re: Datei Binder/Joiner
 
Naja... is mir jetzt auch klar, dass das ein sfx-modul ist...
Aber für Aufgabenstellung sollte meins ja wohl reichen.

Counter909 5. Jan 2008 03:11

Re: Datei Binder/Joiner
 
ich beschäftige mich erade auch mit dem thema

jetzt ist aber meine Frage:


welche aufgaben hat die ".stub" (die beliebig viele daten drin haben kann)
und warum braucht man die um zum beispiel zwei .exe zu verbinden ??


mfg
counter

TonyMontana 5. Jan 2008 07:45

Re: Datei Binder/Joiner
 
Bei mir funktioniert der Quelltext des obigen Programms nicht korrekt!
Die letzte Datei, die entpackt wirdi st immer 0 Byte groß :wiejetzt:
Kann mir jemand weiterhelfen?

Ach ja und warum müssen die Resourcen Uppercase gespeichert werden(funktioniert nur so!)?
Die Dateinamen sehen dann nämlich nach dem Entpacken nicht so toll aus :roll:

Zacherl 5. Jan 2008 15:49

Re: Datei Binder/Joiner
 
Bei mir funktionierte dieser Code damals wunderbar. Ressourcen sind IMHO immer UpperCase, auch wenn du sie nicht UpperCase speicherst. Der Name, den du ausließt wird wieder in Großbuchstaben sein.

Warum die letzte Datei bei dir immer 0 Byte ist kann ich dir nicht sagen, wohl aber, dass man diesen Joiner um einiges verbessern kann, indem man zusätzlich eine Datei mit allen Dateipfäden / Dateinamen anhängt, anhand derer die Dateien dann richtig benannt und in andere Verzeichnisse als C: kopiert werden können. (Man könnte sie evtl. auch noch ausführen lassen oder sowas wie {APPDATA} als Umgebungsvariablen im Pfadnamen zulassen)

Counter909 5. Jan 2008 20:18

Re: Datei Binder/Joiner
 
ich mein wenn ich den code öffne und starte dann sieht das programm ja nun ganz simpel aus

aber wo hau er denn die .exe hin die zusammengefügt wird?
(darum denk ich fast dass es bei mir auch nicht funzt, finde die nämlich nicht)

ErazerZ 5. Jan 2008 20:32

Re: Datei Binder/Joiner
 
Die Dateien werden in Ressourcen gespeichert.

Counter909 5. Jan 2008 20:45

Re: Datei Binder/Joiner
 
öööööööööö ^^


d.h was ? wie kann ich diese Ressourcen denn auswerten ?

ErazerZ 5. Jan 2008 20:48

Re: Datei Binder/Joiner
 
Siehst doch im Stub code. Es werden einfach alle Ressourcen die im RT_RCDATA vorhanden sind, einfach auf C:\ geschrieben.

Counter909 5. Jan 2008 21:09

Re: Datei Binder/Joiner
 
naja, das ist bei mir eben nicht so....C:/ Windows ist und bleibt leer :-|
naja keine ahnung

TonyMontana 5. Jan 2008 22:18

Re: Datei Binder/Joiner
 
@Zacherl:
Naja bie mir funktioniert der Code eben nicht ^^
Kanns mir halt nicht so wirklich erklären, da die Callbackfunktion ja eigentlich die Datei schreiben müsste, auch die letzte.
Vielleicht sollte ich mal nen neustart machen und dann schauen ob es richtig funktioniert :)
Ja ich denke, die Resourcen sind wirklich IMMER Uppercase, so sehr, dass falls man im Code das Uppercase rausnimmt, das Ganze nicht mehr funktioniert :gruebel:

@ALL:
Hat jemand anderes den gleichen Fehler schon mal produziert, also dass die letzte Datei immer null-Bytes groß ist???

Hat sich erledigt mit dem "Fehler", der ist von ganz alleine verschwunden, habe nur Delphi neugestartet. :zwinker:
Keine Ahnung woran es lag, hauptsache es funktioniert jetzt :mrgreen:

Zacherl 5. Jan 2008 22:20

Re: Datei Binder/Joiner
 
Zitat:

Zitat von TonyMontana
@Zacherl:
Ja ich denke, die Resourcen sind wirklich IMMER Uppercase, so sehr, dass falls man im Code das Uppercase rausnimmt, das Ganze nicht mehr funktioniert :gruebel:

Na dann guck dir die Datei halt mal im RessourceHacker an, einmal mit Uppercase und einmal ohne .. naja und zu funktionieren scheint es bei dir ja überhaupt nicht. Insofern kannst du darüber denke ich mal keine Aussage machen .. Unabhängig davon, ob die Ressourcen immer UpperCase sind, sollte die Callback Funktion auch Solche auflisten, welche es unter Umständen nicht sind und deren Name in lpName zurückgeben.

TonyMontana 6. Jan 2008 09:46

Re: Datei Binder/Joiner
 
Doch, wie ich im letzten Beitrag geschrieben habe, es funktioniert jetzt schon. Nur funktioniert es eben nicht falls die Resourcen nicht mit Großbuchstaben gespeichert werden, obwohl die Callback-Funktion eben alle Dateien auflistet! Die Dateien sind dann alle Null Bytes groß, nicht die Resourcen selber aber die Dateien auf der Festplatte!

Weiß da jemand, wie man das beheben kann?

PS: Der ResourceHacker ist wirklich ein schönes Programm, kann ich auch nur empfehlen!

Noch ne Frage :-D
Wo kann man bei Delphi einstellen, welche Resourcen in die Stub mitkompiliert werden? Also konkret geht es mir um die Resourcen mit Namen "DVCLAL" und "PACKAGEINFO", da diese ansonsten ja immer mit entpackt werden, falls man keine Abfrage dafür implementiert.

BTW wofür sind die beiden Resourcen genau gut, bzw. braucht man die??

Danke!

ErazerZ 6. Jan 2008 13:18

Re: Datei Binder/Joiner
 
Die beiden Ressourcen kannst du ohne bedenken entfernen. Ich glaube da wird nur gespeichert ob du eine gültige Delphi-Lizenz hast oder so etwas.

TonyMontana 6. Jan 2008 16:42

Re: Datei Binder/Joiner
 
Ok, danke für die Info!

Dann gehe ich mal davon aus, dass man das nicht "einstellen" kann, ob diese beiden Resourcen mitkompiliert werden. Naja, da
ich zu faul bin diese jedesmal von Hand zB mit dem ResourceHacker zu löschen, werde ich wohl einfach ne Abfrage einfügen, die verhindert, dass diese beiden Resourcen ebenfalls entpackt werden.


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