This class allows you to create self extracting executables for use in
distribution or setup programs. Many people have helped me along the way to
produce this class but here are a couple I would like to thank.
- Levente Farkas - For the suggestion of how the class might be
- Roger Allen - For further advice on the reading and writing of the
- Jamie Thornback - For help with the callback procedures
- Tim Johnson - For his CShellFileOp class which is used briefly in
A new addition to this class is compression courtesy of Zlib and the following contributors: -
- Luca Piergentili - For his suggestions and source code contributions for the compression features.
- Mark Nelson - For his Zlib wrapper class which I mercylessly butchered into my own code.
Description of the Self-Extracting (SFX) executable
The SFX file which this class creates consists of an extraction executable
with the data files appended to the end of it. The data on the end of the file
does not affect the executable image and so the file executes as if the data
wasn't even there. So to extract the data, the executable must first detach the
data from itself and then create the approriate files. The way I have chosen to
do this is to write a 'Table of Contents' (TOC) after the data which can be read
by the extractor to find out where the various files are stored in the data
The layout of the TOC is as follows:-
Starting from the end of the archive and working backwards :
- 10 bytes - Signature (Identifier for SFX archive)
- 4 bytes - Version number of SFX archive
- 4 bytes - Number of files in archive
Table of Contents
This section contains one record in the following format for each file
- 4 bytes - Length of filename
- variable length - Filename
- 4 bytes - Length of File (compressed)
- 4 bytes - Length of File (uncompressed)
- 4 bytes - Offset in archive to data
Each file is the compressed in memory using zlib and then written in the order of the TOC. After this is the extractor executable.
How To Use it
Having said all that, you don't need to know any of that stuff above to use
it. All you need to do is create an instance of CSelfExtractor and then call
AddFile() to add in all the files that you want to include. Next call Create()
to create the archive.
The demo project consists of two projects - 'Extractor' which is the
executable which extracts the archive and Self Extractor which is the program
for building Self Extracting archives. Self Extractor allows you to specify an
external extractor program to use for the archive or alternatively you can use
the extractor which has been compiled into the program inside the resources.
Read the source code to find out more.
The Zlib source code is subject to the licence documented here. The demos make use of classes written by other people at both codeguru.com and here at codeproject.com so any bugs in
those should be directed at their respective authors.
21st August 2002 - Updated code with fixes suggested by readers relating to file permissions and
CFileDialog. Also updated Zlib to v1.14 which fixes an important security problem.