Creating a Self Extracting Executable

Environment: VC5 SP3, NT4 SP4

Introduction

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 implemented
Roger Allen - For further advice on the reading and writing of the data
Jamie Thornback - For help with the callback procedures
Tim Johnson - For his CShellFileOp class which is used briefly in this class

Please note that this class does not contain any compression algorithms so the resulting executable with be the size of the sum of it's parts. The class could easily be extended to add compression in the future if anyone wishes.

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 segment.

File Layout

The layout of the TOC is as follows:-

Starting from the end of the archive and working backwards :-
Header Info
10 bytes - Signature (Identifier for 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
4 bytes - Offset in archive to data

Data Segment
Each file is written (uncompressed) here 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.

As always, expect bugs. Don't shout if you can't get it to work. The demos are just as they sound - demos. They are not fully implemented and fully tested release software, they are an example of how the classes should be used. The demos make use of classes written by other people at CodeGuru so any bugs in those should be directed at their respective authors.

Downloads

Download demo project - 76 Kb


Comments

  • GetModuleFileName & Win ME

    Posted by Legacy on 12/07/2001 12:00am

    Originally posted by: Steve Serrell

    Thanks for this great work. I've used it now for well over a year. Now that I have gotten a Win ME machine I have a problem in the Extractor. It seems that when the extractor calls GetThisFileName(), GetModuleFileName() returns ..\path\EXTRACTOR.EXE instead of the file name. I don't know a fix for this. I have tried variations on GetModuleFileName() to no avail. Any Ideas?
    
    Thanks

    Reply
  • GetFileCount() broken?

    Posted by Legacy on 09/25/2000 12:00am

    Originally posted by: Tuncer M. Ayaz

    The Accessor-Function GetFileCount always returns 0.
    So it seems to me that either m_nFiles isn't stored or GetFileCount can't properly read this value out of the SFX.
    Any ideas?

    Reply
  • VC++6.0 - WARNING IN int CSelfExtractor::CreateArchive(....

    Posted by Legacy on 05/10/2000 12:00am

    Originally posted by: David Lafay

    Hi,

    int CSelfExtractor::CreateArchive(CFile* pFile, funcPtr pFn, void* userData)

    don't return a value all the time,
    then the compiler generate a Warning.

    BUT it's not a big problem.

    THANKS, THIS CLASS IS FANTASTIC !!!

    Reply
  • PowerArchiver SFX Maker

    Posted by Legacy on 03/24/2000 12:00am

    Originally posted by: David Cornish

    For those interested in creating more powerful SFX archives for FREE, visit:

    http://sfxmaker.cjb.net

    Reply
  • Cool!!!

    Posted by Legacy on 02/17/2000 12:00am

    Originally posted by: Mike

    Very cool programm!!!

    I didn't know that you needn't patch the exefile if you
    create a new one!
    Keep on coding!!!

    • can't get demos to work?

      Posted by mok01 on 08/03/2004 05:07am

      When I tried compiling the Self Extractor program, i got hundreds of errors in the .h files....did you get this also at the beginning?

      Reply
    Reply
  • Thanks Guys

    Posted by Legacy on 02/14/2000 12:00am

    Originally posted by: James Spibey

    Thanks for the bug fixes, guys.

    These problems never surfaced during my (extremely sketchy) testing. Thanks for pointing them out.

    James

    Reply
  • two bugs and fixes

    Posted by Legacy on 02/12/2000 12:00am

    Originally posted by: eric

    James,at first,thanks for your cool code.
    
    but i've found two bugs and here are the fixes:
    1.file include error.
    after extract the source code,and recompile the project,
    the compiler report that can not found header file.in both
    self extractordlg.h and extractordlg.h,change:
    #include "SelfExtractor.h"
    #include "DirDialog.h"
    #include "TextProgressCtrl.h"
    into:
    #include "..\shared\SelfExtractor.h"
    #include "..\shared\DirDialog.h"
    #include "..\shared\TextProgressCtrl.h"
    the build will be ok.
    2.when you extract the data file,there is an internal
    error.To fix this bug,you must change two places:

    (1).in selfextractor.cpp,modify the ReadTOC function from
    int CSelfExtractor::ReadTOC(CString Filename)
    {
    ...
    if(!Thisfile.Open(Filename,CFile::modeRead))
    ...}
    to:
    if(!Thisfile.Open(Filename,CFile::modeRead|CFile::shareDenyNone))

    (2).also in selfextractor.cpp,moddify the ExtractAll function from
    int CSelfExtractor::ExtractAll(CString Dir, funcPtr pFn /*= NULL*/, void * userData /*= NULL*/)
    {...
    if(!Thisfile.Open(GetThisFileName(), CFile::modeRead))
    ...}
    to
    if(!Thisfile.Open(GetThisFileName(), CFile::modeRead|CFile::shareDenyNone))
    and rebuild it,you can enjoy it now.
    this tech is very useful and very cool!!thanks,James.


    Reply
  • Demo projects do not compile

    Posted by Legacy on 02/10/2000 12:00am

    Originally posted by: Rick

    I downloaded the demo project and extracted the 2 projects out of it. Neither of the projects will compile as is. They all have missing header files etc...

    • can't get demos to work....

      Posted by mok01 on 08/03/2004 05:08am

      I can't get the demos working either??? I get lots of errors in the .h files? any ideas whats wrong??

      Reply
    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • With 81% of employees using their phones at work, companies have stopped asking: "Is corporate data leaking from personal devices?" and started asking: "How do we effectively prevent corporate data from leaking from personal devices?" The answer has not been simple. ZixOne raises the bar on BYOD security by not allowing email data to reside on the device. In addition, Zix allows employees to maintain complete control of their personal device, therefore satisfying privacy demands of valued employees and the …

  • If you need new tools and tricks to make your meetings profitable and productive, then 5 Tips in 5 Minutes: A Quick Guide for More Profitable Sales Meetings is for you. Timely, practical tips that you can incorporate in just seconds will save you literally hours in travel and meeting time, not to mention help you to focus on what your sales prospects really want to know and how you can meet their needs. Get 5in5: A Quick Guide for More Profitable Sales Meetings and start building your sales the smarter, faster …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds