Thema: Delphi Datei Binder/Joiner

Einzelnen Beitrag anzeigen

Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Datei Binder/Joiner

  Alt 6. Jan 2006, 20:28
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.
  Mit Zitat antworten Zitat