繁体   English   中英

LoadLibrary 失败时如何得到错误信息框?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM