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

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

  • 在程序启动时,扫描插件文件夹。
  • find每个插件,检查该插件是否已经加载。 (这可能是,如果一个以前加载的插件导致它作为依赖加载)。
  • 如果没有,加载它。

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

请不要回答“只是加载它”。 我知道这将工作。 我试图避免这一点。

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

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

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

使用EnumProcessmodulees枚举进程中的加载库也是可能的,但是对于您所描述的任务来说可能有些过度。 没有PSAPI你可能会用这些简单而简单的功能。