Sample code for 30+ languages & platforms
Delphi ActiveX

Create Self-Extracting Executable (Windows-only)

Demonstrates how to create a Windows self-extracting EXE.

Chilkat Delphi ActiveX Downloads

Delphi ActiveX
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Chilkat_TLB;

...

procedure TForm1.zipAbortCheck(ASender: TObject;  out abort: Integer);
begin
    // TThread.Synchronize provides safety for callbacks that occur in a background thread..
    TThread.Synchronize(nil, procedure begin
      
      end);
end;

procedure TForm1.zipPercentDone(ASender: TObject;  percentDone: Integer; out abort: Integer);
begin
    // TThread.Synchronize provides safety for callbacks that occur in a background thread..
    TThread.Synchronize(nil, procedure begin
      Memo1.Lines.Add('Percent Done: ' + IntToStr(percentDone));
      // Explicitly abort at 25% or greater.
      // Remove this to allow for the HTTP download to run to completion.
      if (percentDone > 25) then
        begin
          abort := 1;
        end;
      end);
end;

procedure TForm1.zipProgressInfo(ASender: TObject;  const name: WideString; const value: WideString);
begin
    // TThread.Synchronize provides safety for callbacks that occur in a background thread..
    TThread.Synchronize(nil, procedure begin
      Memo1.Lines.Add(name + ': ' + value);
      end);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
success: Integer;
zip: TChilkatZip;
recurse: Integer;

begin
    success := 0;

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    zip := TChilkatZip.Create(Self);
    zip.OnAbortCheck := zipAbortCheck;
    zip.OnPercentDone := zipPercentDone;
    zip.OnProgressInfo := zipProgressInfo;

    // Initialize the zip object.  Because we're creating
    // a self-extracting EXE in this example, the filename
    // passed to NewZip will never actually be created.
    success := zip.NewZip('notUsed.zip');
    if (success <> 1) then
      begin
        Memo1.Lines.Add(zip.LastErrorText);
        Exit;
      end;

    // Append a directory tree.  The AppendFiles does
    // not read the file contents or append them to the zip
    // object in memory.  It simply appends references
    // to the files so that when WriteExe (or WriteZipAndClose,
    // or WriteZip, etc.) is called, the files are compressed
    // and added to the archive.
    recurse := 1;
    zip.AppendFiles('c:/temp/a/*',recurse);

    // Write "sfx.exe"
    success := zip.WriteExe('c:/temp/sfx.exe');
    if (success <> 1) then
      begin
        Memo1.Lines.Add(zip.LastErrorText);
        Exit;
      end;
end;