2012-08-13 45 views
2

我正在开发基于插件的体系结构的程序。所有的插件都是DLL,其中一些可以依赖于其他插件DLL。我希望能够执行以下操作:如何查看我的程序是否已经加载了某个DLL?

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

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

请不要回答“只是加载它”。我知道这会起作用。我试图避免这种情况。

+0

执行listdlls.exe并解析结果;) – Qiau 2012-08-13 17:31:01

+0

@Qiau:我宁愿不必依靠外部实用程序,特别是最终用户可能不会(也可能不会)他的系统。 – 2012-08-13 17:32:14

+0

http://stackoverflow.com/questions/15536​​03/how-to-know-if-a-given-dll-is-loaded-by-a-given-process 或 http://stackoverflow.com/questions/450039 /如何以编程方式获取DLL的依赖关系 可能会回答你的问题? – Qiau 2012-08-13 17:33:47

回答

4

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

如果lpModuleName不包括路径和存在具有相同基名和扩展名以上的 加载的模块,你不能 预测哪些模块句柄将被退回。若要解决此问题,您可以指定一个路径,使用并行程序集或使用GetModuleHandleEx指定内存位置而不是DLL名称。

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

EnumProcessModules的过程中枚举加载的库也是可能的,但对于您描述的任务可能有点矫枉过正。如果没有PSAPI,这些简单明了的功能可能会很好。

+0

谢谢,这看起来像我正在寻找。 – 2012-08-13 17:41:56

相关问题