我正在开发一个基于插件的体系结构的程序。 所有的插件都是DLL,其中一些可以依赖于其他的插件DLL。 我希望能够做到以下几点:
第一和第三步是微不足道的,但是我怎么做第二步呢? 有一个winapi调用,给定一个DLL的文件名,会告诉我,如果该DLL当前加载到当前进程? (或者可能需要一个文件名和一个进程句柄?)
请不要回答“只是加载它”。 我知道这将工作。 我试图避免这一点。
GetmoduleeHandle
API为加载的DLL提供HMODULE
,否则为NULL,如果未加载。 请注意,如果需要,您可以省略路径。 您也可以获取HMODULE
作为没有路径的名称,然后使用此句柄获取GetmoduleeFileName
,以便获得完整路径以与期望的进行比较。
如果lpmoduleeName不包含路径,并且有多个具有相同基本名称和扩展名的已加载模块,则无法预测将返回哪个模块句柄。 要解决此问题,您可以指定一个路径,使用并行程序集,或者使用GetmoduleeHandleEx指定一个内存位置,而不是一个DLL名称。
GetmoduleeHandle函数返回映射模块的句柄,而不增加其引用计数。 但是,如果将此句柄传递给FreeLibrary函数,则映射模块的引用计数将递减。 因此,不要将由GetmoduleeHandle返回的句柄传递给FreeLibrary函数。 这样做可能会导致DLL模块被提前取消映射。
使用EnumProcessmodulees
枚举进程中的加载库也是可能的,但是对于您所描述的任务来说可能有些过度。 没有PSAPI
你可能会用这些简单而简单的功能。