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