Click here to Skip to main content
15,886,689 members
Articles / Desktop Programming / MFC
Article

A Simple Resource Manager

Rate me:
Please Sign up or sign in to vote.
2.92/5 (13 votes)
5 Jun 2003 66.6K   785   25   9
This is a simple class that you can use to load and use another resource DLL if it is present during runtime.

Introduction

I have created this class to help me load a different resource DLL if it is present during runtime. An example would be a multi-language application. If another resource DLL (with a name specified at compile time) is present, it can load and use it as the resource for the application.

Let's look at the class header. It is quite simple and I think the comments describe well about the individual methods.

class CResourceManager  
{
// Operations
public:

    // Constructor
    CResourceManager();

    // Destructor
    virtual ~CResourceManager();

    // Load external resource dll. If file not present or unable to load,
    // it returns FALSE. If it is present, it is loaded but does not affect
    // the default resource of the application. You should call this if you
    // want to manage the current application resource and an external one.
    BOOL Setup(CString);

    // Load external resource dll and set it as default for application.
    // Before setting as default, the current resource handle is stored
    // in case when you need to access the resource there.
    // If file not present or unable to load, the current application
    // resource is being used. 
    BOOL SetupEx(CString);

    // Get string from string table of external resource if any
    // If there is an external resource loaded, GetString will retrieve from
    // there. If not, it will retrieve from the application default resource.
    CString GetString(UINT);

// Attributes
private:

    HINSTANCE m_hExternalResource; // Handle to external resource loaded
    HINSTANCE m_hApplicationResource; // Handle to current application resource
};

Using the code

Below is an example of how you may use the methods of the class. First you need to create an object of CResourceManager. You can put it as global or as a member of your application class. Then, call the Setup(...) method in InitInstance(...) as shown below.

BOOL CtestApp::InitInstance()
{
    // InitCommonControls() is required on Windows XP if an application
    // manifest specifies use of ComCtl32.dll version 6 or later to enable
    // visual styles.  Otherwise, any window creation will fail.
    InitCommonControls();

    CWinApp::InitInstance();

    // Initialize OLE libraries
    if (!AfxOleInit())
    {
        AfxMessageBox(IDP_OLE_INIT_FAILED);
        return FALSE;
    }
    AfxEnableControlContainer();



    // Load and set the specified resource dll as default if it is present.
    // Normally the location of the dll would be the same as the executable
    // and you would need to determine it with GetModuleFileName(...), but
    // in this case, i assume i know where the dll is located.
    m_oResourceManager.SetupEx(_T("C:\\MyProjects\\anotherres.dll"));

    .
    .
    .
    
    // The one and only window has been initialized, so show and update it
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    // call DragAcceptFiles only if there's a suffix
    //  In an SDI app, this should occur after ProcessShellCommand
    return TRUE;
}

As for cleaning up the loaded resource DLL, the destructor will handle it as shown below.

CResourceManager::~CResourceManager()
{
    // Check if handle is valid, free library
    if (m_hExternalResource != NULL)
        FreeLibrary(m_hExternalResource);

    // Init handles
    m_hExternalResource = NULL;
    m_hApplicationResource = NULL;
}

Points of interest

I admit that this class do fall short in terms of the other resource problems that could be addressed, but feel free to extend it if you want. :)

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


Written By
Singapore Singapore
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralAre you the one!!!!!111 Pin
saajan18-May-04 2:30
saajan18-May-04 2:30 
GeneralRe: Are you the one!!!!!111 Pin
Weiye Chen20-May-04 5:05
Weiye Chen20-May-04 5:05 
GeneralPlease provide a demo application. Pin
John M. Drescher7-Jun-03 4:31
John M. Drescher7-Jun-03 4:31 
GeneralBroken link. Pin
WREY7-Jun-03 2:21
WREY7-Jun-03 2:21 
GeneralRe: Broken link. Pin
Weiye Chen7-Jun-03 3:15
Weiye Chen7-Jun-03 3:15 
GeneralSomething handy to have around. Pin
WREY7-Jun-03 4:00
WREY7-Jun-03 4:00 
GeneralRe: Something handy to have around. Pin
Weiye Chen7-Jun-03 4:25
Weiye Chen7-Jun-03 4:25 
GeneralRe: Something handy to have around. Pin
Anton Heidelwalder28-Oct-04 4:54
Anton Heidelwalder28-Oct-04 4:54 
GeneralRe: Something handy to have around. Pin
WREY28-Oct-04 7:02
WREY28-Oct-04 7:02 
I don't know what you mean by "languages", whether you're referring to C++, VB, or Fortran, (etc.), or whether you're talking about English, French, or Russian, (etc.). In any case, I haven't tried it with either.

As far as switching resources (meaning, resource libraries) during runtime, the answer is "yes", that's very doable. Just make sure the library is already loaded (and that's it's the correct one you want) before you start using it. That might sound trivial, but I've seen so many people (including myself) get tripped-up because of failure to load the correct DLL library (even though sometimes it's not your fault).

A word of caution!!! Do NOT start getting happy-crazy by switching DLL's all over the place. It can become very expensive doing so, not to mention opening up yourself for bad things to happen.

The author did a pretty good job at explaining what he set out to accomplish, and some instructions on how to use his class. It is not difficult, and once you get it to work the first time, you'll see how easy and handy it is to have around.

I wish you much success!!

Smile | :)

William

Fortes in fide et opere!

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.