[英]How to get an error message box when LoadLibrary fails?
我希望 proc 显示详细信息,例如缺少哪个依赖项,dll 是否无效...
int main(int argc, char *argv[]) {
// Record original error mode
UINT prevErrorMode = GetErrorMode();
::SetErrorMode(0);
std::wstring wstr;
// Get library absolute path and store into wstr.
// ...
typedef int (*EntryFun)(int, char *[]);
HINSTANCE hDLL = ::LoadLibraryW(wstr.data());
int res = -1;
if (hDLL != NULL) {
EntryFun fun = (EntryFun)::GetProcAddress(hDLL, "main_entry");
if (fun != NULL) {
// Restore error mode
SetErrorMode(prevErrorMode);
res = fun(argc, argv);
} else {
res = ::GetLastError();
::MessageBoxW(nullptr, TO_UNICODE("Failed to find entry!"), TO_UNICODE("Error"),
MB_OK | MB_ICONERROR);
}
::FreeLibrary(hDLL);
} else {
res = ::GetLastError();
::MessageBoxW(nullptr, TO_UNICODE("Failed to load main module!"), TO_UNICODE("Error"),
MB_OK | MB_ICONERROR);
}
return res;
}
我使用SetErrorMode
但它似乎不起作用,LoadLibrary 返回NULL
后没有消息框。
此外, FormatMessage
也无济于事,因为它无法提供有关缺少哪个依赖项的信息。
LoadLibrary通过GetLastError报错。 运行时动态链接的优点是即使 DLL 不可用,运行时动态链接也能使进程继续运行。 您可以编写自己的加载程序来自己遍历依赖项,直到找到@RemyLebeau 所说的缺失内容。 有一个MemoryModule repository,它从memory加载了一个DLL,你可以参考。
但是对于Load-Time Dynamic Linking ,如果系统找不到 DLL ,系统只会终止进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.