我正在开发一个基于插件的架构的程序。所有插件都是DLL,其中一些插件可能依赖于其他插件DLL。我希望能够做到以下几点:
第一步和第三步是微不足道的,但我该如何做第二步呢?是否有一个winapi调用,给定一个DLL的文件名,将告诉我该DLL当前是否加载到当前进程? (或者也许是一个带文件名和进程句柄的人?)
拜托,没有答案说“无论如何都要加载它。”我知道这会奏效。我试图避免这种情况。
答案 0 :(得分:4)
GetModuleHandle
API为加载的DLL提供HMODULE
,如果未加载,则为NULL。请注意,如果需要,您可以省略路径。您还可以获取HMODULE
没有路径的名称,然后使用此句柄GetModuleFileName
获取完整路径以与您期望的内容进行比较。
如果lpModuleName不包含路径且有多个路径 加载模块具有相同的基本名称和扩展名,你不能 预测将返回哪个模块句柄。解决这个问题 问题,您可以指定路径,使用并排程序集或使用 GetModuleHandleEx指定内存位置而不是DLL名称。
GetModuleHandle函数返回映射模块的句柄 不增加其引用计数。但是,如果这个句柄是 传递给FreeLibrary函数,映射的引用计数 模块将递减。因此,不要传递返回的句柄 通过GetModuleHandle到FreeLibrary函数。这样做可能会导致 DLL模块过早地取消映射。
使用EnumProcessModules
在进程中枚举已加载的库也是可能的,但对于您描述的任务可能有点过分。如果没有PSAPI
这些简单明了的函数,你可能会很擅长。