下面的代码是我开发一个插件系统的一部分。 基本上它加载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文件相关联,并与该插件的链接)。