Sample code for 30+ languages & platforms
C++

Create Self-Extracting Executable (Windows-only)

Demonstrates how to create a Windows self-extracting EXE.

Chilkat C++ Downloads

C++
#include <CkZip.h>

#include <CkZipProgress.h>

class zipProgress : public CkZipProgress {

  public:
  zipProgress() { }
  virtual ~zipProgress() { }

  void AbortCheck(bool *abort) {
    // Application code goes here.
  }

  void PercentDone(int percentDone, bool *abort) {
    std::cout << "Percent Done: " << percentDone << "\r\n";
    //  Explicitly abort at 25% or greater.
    //  Remove this to allow for the HTTP download to run to completion.
    if (percentDone > 25) {
        *abort = true;
    }
  }

  void ProgressInfo(const char *name, const char *value) {
    std::cout << name << ": " << value << "\r\n";
  }

};

void ChilkatSample(void)
    {
    bool success = false;

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

    CkZip zip;
    zipProgress zip_progress;
    zip.put_EventCallbackObject(&zip_progress);

    //  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 != true) {
        std::cout << zip.lastErrorText() << "\r\n";
        return;
    }

    //  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.
    bool recurse = true;
    zip.AppendFiles("c:/temp/a/*",recurse);

    //  Write "sfx.exe"
    success = zip.WriteExe("c:/temp/sfx.exe");
    if (success != true) {
        std::cout << zip.lastErrorText() << "\r\n";
        return;
    }
    }