获取丢失在运行时依赖的名字 - 指定的模块找不到(Get name of missing depen

2019-09-29 08:20发布

下面的代码是我开发一个插件系统的一部分。 基本上它加载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手动找到它(实际上它就是我正在做它现在),但这个过程是相当复杂的,因为正如你由着LOAD_LIBRARY_SEARCH_DEFAULT_DIRS标志,依赖关系可以位于不同的目录中。 搜索路径加载使用插件之前指定AddDllDirectory ,并与恢复RemoveDllDirectory加载后。

对于上述原因,使用依赖沃克是相当乏味:对于失败我必须添加用于加载插件的目录的每个插件(有许多插件和每一个可以具有不同的搜索路径设置)。

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

其他注意事项:使用Visual Studio 2017年,几乎所有的依赖关系(DLL)中已导出的符号(的.lib文件相关联,并与该插件的链接)。

文章来源: Get name of missing dependencies at runtime - The specified module could not be found