VC ++项目,如何定义DLL丢失的错误信息?

时间:2013-09-03 13:01:26

标签: c++ visual-studio-2010 winapi visual-c++ dll

所以这个想法是当用户没有安装DirectX End-User Runtime程序时显示消息“DirectX Runtime missing!从这里下载”,而不是windows loader错误(例如:“d3dx9_43.dll”不见了!”)。所以我找到了一个非常时髦的问题解决方案,因为在使用LoadLibrary调用模块中定义的任何函数之前,我使用了延迟加载的DLL和DLL检查。如果缺少dll,程序将显示一个用户定义的对话框并退出,否则它将使用LoadLibrary返回的HMODULE调用FreeLibrary并继续执行。这是通过以下函数实现的:

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;
}

*由于DxRedistMissingDlg和MAKEINTRESOURCE(IDD_DX_RE)创建用户定义的错误消息对话框。

在WinMain中,它被称为如下:

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

}

但我不认为这是最干净的方法。首先我们不确定d3dx9.lib是否真的继承自D3DX9_43.dll(我知道因为我使用了IDA PRO)并且LoadLibrary函数被调用了两次 - 一次是在CheckResourcesAvailability()函数中,第二次是在DLL延迟时-loaded。有没有更好实施的想法?

1 个答案:

答案 0 :(得分:2)

使用delay load hooks让延迟加载程序在给定的DLL或特定的导出函数丢失时通知您。这不仅可以告诉您缺少哪个DLL /函数,还可以根据需要指定替代DLL /函数。