如何确定我的程序是否已加载某个DLL?

时间:2012-08-13 17:28:33

标签: windows winapi

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

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

第一步和第三步是微不足道的,但我该如何做第二步呢?是否有一个winapi调用,给定一个DLL的文件名,将告诉我该DLL当前是否加载到当前进程? (或者也许是一个带文件名和进程句柄的人?)

拜托,没有答案说“无论如何都要加载它。”我知道这会奏效。我试图避免这种情况。

1 个答案:

答案 0 :(得分:4)

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

  

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

     

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

使用EnumProcessModules在进程中枚举已加载的库也是可能的,但对于您描述的任务可能有点过分。如果没有PSAPI这些简单明了的函数,你可能会很擅长。