在运行时获取缺少的依赖项的名称 - 找不到指定的模块

时间:2017-06-08 08:44:29

标签: c++ winapi dependencies loadlibrary

以下代码是我正在开发的插件系统的一部分。基本上它加载DLL,如果失败,则显示错误消息。

HMODULE loadPlugin(LPTSTR path) {
    const auto module = LoadLibraryEx(path, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);

    if (module != nullptr) return module;

    LPTSTR errorText = nullptr;
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
                  FORMAT_MESSAGE_ALLOCATE_BUFFER |
                  FORMAT_MESSAGE_IGNORE_INSERTS,
                  NULL, GetLastError(), 0,
                  (LPTSTR)&errorText, 0, NULL);

    if (errorText != nullptr) {
        MessageBox(0, errorText, L"Error", MB_OK | MB_ICONWARNING);
        LocalFree(errorText);
        errorText = NULL;
    }

    return nullptr;
}

最常见的错误是缺少正在加载的DLL的依赖项(也适用于依赖项的依赖项等):无法找到指定的模块。不幸的是,这个错误对于了解哪个依赖是非常有用。

我知道我可以使用 Dependency Walker 来手动找到它(实际上它就是我现在正在做的事情),但是这个过程非常复杂,正如你在{{1标志,依赖关系可以位于不同的目录中。在使用LOAD_LIBRARY_SEARCH_DEFAULT_DIRS加载插件之前指定搜索路径,并在加载后使用AddDllDirectory进行恢复。

由于上述原因,使用 Dependency Walker 非常繁琐:对于每个失败的插件,我必须添加用于加载该插件的目录(有很多插件,每个插件可能有不同的搜索路径设置)。

问题:有没有办法在运行时知道未找到的模块的名称?我也是插件的开发者,所以我可以在必要时修改它们。

附加说明:使用Visual Studio 2010,几乎所有依赖项(DLL)都有导出符号(.lib文件与插件关联并链接)。

0 个答案:

没有答案