user1798386
user1798386

Reputation:

VC++ project, how to define DLL missing error messages?

So the idea is when the user haven't installed DirectX End-User Runtime the program to show message like "DirectX Runtime missing! Download it from here", instead of the windows loader error (eg.: "d3dx9_43.dll is missing!"). So I find a very funky solution of the problem as I used a delay loaded DLL's and an DLL check before any function defined in the module is invoked using LoadLibrary. If the dll is missing the program shows a user-defined dialog box and exits, otherwise it calls FreeLibrary with the HMODULE returned by LoadLibrary and continues executing. This is implemented as a function like follows:

bool CheckResourcesAvailability() //Mainly check for the existence of delay loaded DLL's
{
    HMODULE hMod; //Resourse handle

    if((hMod = LoadLibraryEx(_T("d3d9.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)) == NULL)
    {
        DialogBox(hProgramInstance, MAKEINTRESOURCE(IDD_DX_RE), 0, (DLGPROC)&DxRedistMissingDlg);
        return false;
    }

    FreeLibrary(hMod);

    if((hMod = LoadLibraryEx(_T("D3DX9_43.dll"), NULL, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)) == NULL)
    {
        DialogBox(hProgramInstance, MAKEINTRESOURCE(IDD_DX_RE), 0, (DLGPROC)&DxRedistMissingDlg);
        return false;
    }

    FreeLibrary(hMod);

    return true;
}

*As DxRedistMissingDlg and MAKEINTRESOURCE(IDD_DX_RE) creates the user-defined error message dialog.

And In WinMain it's called as follows:

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    hProgramInstance = hInstance;

#ifndef _DEBUG
    SetErrorMode(SEM_FAILCRITICALERRORS); //Don't display windows error messages
#endif

    //Check for missing delay - loaded dependencies and inform the user
    if(!CheckResourcesAvailability())
        return -1;
    //Some other code.........

}

But I don't think this is the cleanest way to do it. First we aren't sure that d3dx9.lib really inherits from D3DX9_43.dll (I know that because I used IDA PRO) and also the LoadLibrary function is called twice - one time at the CheckResourcesAvailability() function and second when the DLL is delay-loaded. Any ideas for a better implementation?

Upvotes: 0

Views: 392

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 597036

Use delay load hooks to let the delay loader notify you whenever a given DLL or a specific exported function is missing. Not only does that tell you which DLL/function is missing, but also lets you specify a substitute DLL/function if desired.

Upvotes: 2

Related Questions