如何查明我的程序是否已加载某个 DLL?

Mas*_*ler 4 windows winapi

我正在开发一个具有基于插件的架构的程序。所有插件都是 DLL,其中一些插件可以依赖于其他插件 DLL。我希望能够执行以下操作:

  • 在程序启动时,扫描插件文件夹。
  • 对于找到的每个插件,检查该插件是否已加载。(如果之前加载的插件导致它作为依赖项加载,则可能是这样)。
  • 如果没有,请加载它。

第一步和第三步很简单,但是第二步该怎么做呢?是否有一个 winapi 调用,在给定 DLL 文件名的情况下,会告诉我该 DLL 当前是否已加载到当前进程中?(或者可能需要一个文件名和一个进程句柄?)

请不要回答说“无论如何都加载它”。我知道这会起作用。我正在努力避免这种情况。

Rom*_* R. 5

GetModuleHandleAPI 为您提供HMODULE已加载的 DLL,如果未加载,则为 NULL。请注意,如果需要,您可以省略路径。您还可以获取HMODULE不带路径的名称,然后GetModuleFileName使用此句柄来获取完整路径以与您期望的进行比较。

如果 lpModuleName 不包含路径,并且存在多个具有相同基本名称和扩展名的已加载模块,则您无法预测将返回哪个模块句柄。要解决此问题,您可以指定路径、使用并排程序集或使用 GetModuleHandleEx 指定内存位置而不是 DLL 名称。

GetModuleHandle 函数返回映射模块的句柄,而不增加其引用计数。但是,如果将此句柄传递给 FreeLibrary 函数,则映射模块的引用计数将减少。因此,不要将 GetModuleHandle 返回的句柄传递给 FreeLibrary 函数。这样做可能会导致 DLL 模块过早取消映射。

枚举进程中加载​​的库EnumProcessModules也是可能的,但对于您所描述的任务来说可能有点过大了。您可能会擅长使用这些简单明了的函数,而无需PSAPI.