3

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

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

第一步和第三步是微不足道的,但我该怎么做第二步呢?是否有一个 winapi 调用,给定一个 DLL 的文件名,它会告诉我该 DLL 当前是否已加载到当前进程中?(或者也许一个需要文件名和进程句柄的?)

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

4

1 回答 1

5

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

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

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

也可以在进程中枚举加载的库EnumProcessModules,但对于您描述的任务来说可能有点过头了。如果没有PSAPI.

于 2012-08-13T17:33:44.033 回答