A Simple Installer

Environment: VC6 Win9x

For an application that consists of more than one file, it is often more convenient to distribute it as a single executable. This article demonstrates how to embed any file as a resource and how to turn that resource back into a file.

For each file you want to include, add a line to resource.h as follows:

  #define IDR_MYFILE 103

Remember to give each file a unique resource ID.

Close all resource files and open your .rc file as "text." Add the line

  IDR_MYFILE RCDATA DISCARDABLE "res\\myfile.ext"

A good place to add this line is immediately after the line which defines the IDR_MAINFRAME icon. If you haven't placed "myfile.ext" in your "res" subdirectory, adjust the path accordingly. Save the .rc file. Close it and open ResourceView. You should see something like this:

There are more convenient ways of inserting a custom data resource, but they either embed the file as raw hex data in the .rc file, inflating it to several times the size of the included file, or neglect to define the resource ID in resource.h so that ResourceView shows the ID in inverted commas.

To turn a resource back into a file, load it into memory using LoadResource(). This returns a BYTE pointer that CFile can use to write that file to disc.

HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_MYFILE),
                                                RT_RCDATA);

// Load the resource and save its total size.
DWORD dwSize = SizeofResource(NULL , hRes);
HGLOBAL MemoryHandle = LoadResource(NULL, hRes);
if(MemoryHandle != NULL){

  // LockResource returns a BYTE pointer to the raw data in
  // the resource
  BYTE *MemPtr = (BYTE *)LockResource(MemoryHandle);


  CFile file("C:\_my_path_to_file\myfile.ext", CFile::modeCreate |
                                               CFile::modeWrite);
  file.Write(MemoryHandle,dwSize);

}
FreeResource((HANDLE)hRes);

The demo project writes a .wav file to the Windows directory and changes a Registry key to make this .wav your default e-mail notification sound.

Downloads

Download source InstallDemo.zip - 108Kb


Comments

  • Error

    Posted by G3D on 02/05/2015 01:08am

    Hello Guy Nice for your's code. But a lower mistake: after the instruction file.Write(MemoryHandle,dwSize); You must do file.Close();

    Reply
  • It does what it aims to do.....

    Posted by Legacy on 04/25/2003 12:00am

    Originally posted by: Richard 'vajuras' Osborne

    Works incredibly well if all you require is a simple uninstaller that uses custom code, etc.

    Reply
  • Good trick. Thanks.

    Posted by Legacy on 11/13/2002 12:00am

    Originally posted by: PixiGreg

    nice. Thanks.

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

Top White Papers and Webcasts

  • Live Webinar June 2, 2015 - 11 am PST / 2 pm EST Your organization and brand are increasingly digital today, proliferating across websites, media outlets, social networks, search engines, mobile apps, online marketplaces and more. Each digital touch point not only enhances the value of your brand, but also represents far greater risk for your company. They increase opportunities for brand defamation and data leakage; act as discreet places to conspire and collude; and open the door to new security …

  • There has been growing buzz about DevOps. DevOps is a methodology that unites the often separate functions of software development (Dev) and production and operations (Ops) into a single, integrated, and continuous process. DevOps is about breaking down the barriers between Dev and Ops. It leverages people, processes, and technology to stimulate collaboration and innovation across the entire software development and release process. Dev and Ops should always be part of an integrated process, but that's not …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date