所以想法是当用户没有安装 DirectX End-User Runtime 时,程序会显示类似“DirectX Runtime missing!从这里下载”的消息,而不是 Windows 加载程序错误(例如:“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 延迟时-加载。有更好实施的想法吗?