2012-08-13 98 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

相關問題