Click here to Skip to main content
6,632,253 members and growing! (20,204 online)
Email Password   helpLost your password?
Languages » C / C++ Language » General     Intermediate

UpdateResource

By DavidCrow

How to manipulate raw resources (RT_RCDATA) using UpdateResource().
VC6Win2K, Visual Studio, MFC, Dev
Posted:7 Sep 2003
Views:67,299
Bookmarked:37 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
18 votes for this article.
Popularity: 5.83 Rating: 4.65 out of 5
1 vote, 5.6%
1
1 vote, 5.6%
2
1 vote, 5.6%
3
2 votes, 11.1%
4
13 votes, 72.2%
5

Introduction

Over the years, I've seen various flavors of the question "How do I include a file or data with my program that I can extract at run-time and do something with it?" For example, the asker might have had a .WAV file or a .MDB (MS Access) file that s/he wanted to include in the actual executable itself. For one reason or another, they do not want to package the two files separately. One advantage this has over a separate data/configuration file is that it'll never get lost. If the user decides they want to start fresh, they can remove everything but the application itself, and when the application is started up again, it extracts an empty database, all without the user knowing the behind-the-scenes details.

So thre are really two questions on the table here: "How to include the file?" and "Once the file is included, how to extract it and 'use' it?" Let's look at a simple example.

Including the file

In this example, I'll show the necessary code to take the entire Windows calculator (calc.exe) and add it as a resource to some test .EXE. The .EXE could just as easily be the application where these code snippets reside. The first thing we must do is open calc.exe in read-only mode, and read the entire file into a buffer.

HANDLE hFile;
DWORD dwFileSize,      
      dwBytesRead;
LPBYTE lpBuffer;

hFile = CreateFile(L"C:\\Winnt\\System32\\calc.exe", GENERIC_READ, 
                   0,
                   NULL,
                   OPEN_EXISTING,
                   FILE_ATTRIBUTE_NORMAL,
                   NULL);

if (INVALID_HANDLE_VALUE != hFile)
{
    dwFileSize = GetFileSize(hFile, NULL);

    lpBuffer = new BYTE[dwFileSize];

    if (ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE)
    {
        // do something with lpBuffer here

    }

    delete [] lpBuffer;        
    
    CloseHandle(hFile);
}

Updating the resource data

Now it's simply a matter of getting access to the resource data of the test file and updating it with the data pointed to by lpBuffer. The third parameter to UpdateResource() is the name we want to give the resource. I just chose an arbitrary name of 104.

HANDLE hResource;

hResource = BeginUpdateResource(L"C:\\...\\t3.exe", FALSE);
if (NULL != hResource)
{
    if (UpdateResource(hResource, 
        RT_RCDATA, 
        MAKEINTRESOURCE(104), 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
        (LPVOID) lpBuffer, 
        dwFileSize) != FALSE)
    {
        EndUpdateResource(hResource, FALSE);
    }
}

At this point, you can actually open the test file with Visual Studio and see the addition of our data in the "Data" section. Be sure to open the file as a "resource"!

Extracting the data

So now your application has been delivered, and you need to extract the resource data.

Extracting the resource data uses functions from the same family as UpdateResource(). The required steps are to load the file containing the resource data, find the desired resource, load the resource, and then lock it.

HMODULE hLibrary;
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;

hLibrary = LoadLibrary(L"C:\\...\\t3.exe");
if (NULL != hLibrary)
{
    hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA);
    if (NULL != hResource)
    {
        hResourceLoaded = LoadResource(hLibrary, hResource);
        if (NULL != hResourceLoaded)        
        {
            lpBuffer = (LPBYTE) LockResource(hResourceLoaded);            
            if (NULL != lpBuffer)            
            {                
                // do something with lpBuffer here            

            }
        }    
    }

    FreeLibrary(hLibrary);
}

Saving the data to a file

All that's left is to create a file with the data pointed to by lpBuffer. Nothing special needs to be done to the data. It's the entire Windows calculator!

DWORD dwFileSize,
      dwBytesWritten;
HANDLE hFile;

dwFileSize = SizeofResource(hLibrary, hResource);

hFile = CreateFile(L"C:\\Winnt\\Temp\\calc2.exe",
                   GENERIC_WRITE,
                   0,
                   NULL,
                   CREATE_ALWAYS,
                   FILE_ATTRIBUTE_NORMAL,
                   NULL);

if (INVALID_HANDLE_VALUE != hFile)
{
    WriteFile(hFile, lpBuffer, dwFileSize, &dwBytesWritten, NULL);

    CloseHandle(hFile);
}

Now you should be able to run the newly created file, calc2.exe! As I indicated at the beginning of the article, this can be done with any sort of file that you want to include along with your main application or DLL.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

DavidCrow


Member

The page you are looking for might have been removed, had its name changed, or is temporarily unavailable.

HTTP 404 - File not found
Internet Information Services

Occupation: Software Developer (Senior)
Company: Pinnacle Business Systems
Location: United States United States

Other popular C / C++ Language articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 34 (Total in Forum: 34) (Refresh)FirstPrevNext
GeneralBITMAP Pinmemberfilipe_madureira6:27 29 May '09  
GeneralRe: BITMAP PinmvpDavidCrow11:49 29 May '09  
GeneralRe: BITMAP Pinmemberfilipe_madureira23:31 1 Jun '09  
GeneralIs it possible to execute the data? Pinmemberflaushi3:30 20 Mar '09  
GeneralRe: Is it possible to execute the data? PinmvpDavidCrow3:47 20 Mar '09  
GeneralThe article helped a lot Pinmemberadenissov13:30 18 Nov '08  
AnswerA way for updating application ICON (from .ICO file) PinmemberElad raz7:35 15 Oct '08  
QuestionRe: A way for updating application ICON (from .ICO file) PinmvpDavidCrow7:42 15 Oct '08  
AnswerRe: A way for updating application ICON (from .ICO file) PinmemberElad raz7:48 15 Oct '08  
GeneralRe: A way for updating application ICON (from .ICO file) PinmvpDavidCrow7:55 15 Oct '08  
GeneralBe sure to apply your checks.. PinmemberChizI6:47 2 May '08  
GeneralRe: Be sure to apply your checks.. PinmvpDavidCrow6:53 2 May '08  
QuestionIcon resources PinmemberArnorBld21:13 11 Dec '06  
AnswerRe: Icon resources PinmemberDavidCrow5:19 13 Dec '06  
GeneralRe: Icon resources PinmemberArnorBld8:05 14 Dec '06  
GeneralJust cant get any better PinmemberRajesh R. Subramanian2:14 28 Jun '06  
GeneralRe: Just cant get any better PinmemberDavidCrow3:28 28 Jun '06  
GeneralUpdateResource RT_ICON PinmemberCG2i034:13 31 May '06  
GeneralRe: UpdateResource RT_ICON PinmemberDavidCrow5:28 31 May '06  
GeneralUpdate Resource within yourself? PinmemberPersetech8:22 1 Feb '06  
GeneralRe: Update Resource within yourself? PinmemberDavidCrow8:46 1 Feb '06  
GeneralGreat! Works PERFECTLY!! Pinmembereliran15:57 15 Apr '05  
GeneralHello Sir ! How To... PinmemberThatsAlok2:47 20 Jan '05  
GeneralGreat, this really helps a lot! PinmemberPaul.Huang23:23 29 Jan '04  
GeneralArticle editing suggestion PinmemberGary Wheeler4:52 9 Sep '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 7 Sep 2003
Editor: Smitha Vijayan
Copyright 2003 by DavidCrow
Everything else Copyright © CodeProject, 1999-2009
Web11 | Advertise on the Code Project