我正在开发一个具有基于插件的架构的程序。所有插件都是 DLL,其中一些插件可以依赖于其他插件 DLL。我希望能够执行以下操作:
第一步和第三步很简单,但是第二步该怎么做呢?是否有一个 winapi 调用,在给定 DLL 文件名的情况下,会告诉我该 DLL 当前是否已加载到当前进程中?(或者可能需要一个文件名和一个进程句柄?)
请不要回答说“无论如何都加载它”。我知道这会起作用。我正在努力避免这种情况。
GetModuleHandleAPI 为您提供HMODULE已加载的 DLL,如果未加载,则为 NULL。请注意,如果需要,您可以省略路径。您还可以获取HMODULE不带路径的名称,然后GetModuleFileName使用此句柄来获取完整路径以与您期望的进行比较。
如果 lpModuleName 不包含路径,并且存在多个具有相同基本名称和扩展名的已加载模块,则您无法预测将返回哪个模块句柄。要解决此问题,您可以指定路径、使用并排程序集或使用 GetModuleHandleEx 指定内存位置而不是 DLL 名称。
GetModuleHandle 函数返回映射模块的句柄,而不增加其引用计数。但是,如果将此句柄传递给 FreeLibrary 函数,则映射模块的引用计数将减少。因此,不要将 GetModuleHandle 返回的句柄传递给 FreeLibrary 函数。这样做可能会导致 DLL 模块过早取消映射。
枚举进程中加载的库EnumProcessModules也是可能的,但对于您所描述的任务来说可能有点过大了。您可能会擅长使用这些简单明了的函数,而无需PSAPI.
| 归档时间: |
|
| 查看次数: |
2856 次 |
| 最近记录: |