2010-02-05 146 views
7

我正在編寫一個DLL來插入另一個(第三方)應用程序。該DLL需要依賴另一組DLL(由於許可原因,我無法靜態鏈接)。依賴於其他DLL的插件DLL

我想我的DLL是「xcopy-deployable」到任何目錄。我也不想要求將這個目錄添加到路徑中。

如果我只是通常的方式構建DLL,Windows將拒絕加載該DLL,因爲它無法在當前進程旁邊找到DLL。

是否有任何幫助Windows找到DLL的好選擇?


要回答一些問題:

  • 的DLL是用C++編寫。
  • 額外的DLL是QT-dll。
  • 我想將額外的DLL放在與我的插件DLL相同的文件夾中。我可以從GetModuleFileName獲得該文件夾的名稱。
  • 該應用程序是Firefox,該DLL是一個PKCS#11安全模塊。
  • 應用程序使用DL​​L的完整路徑加載DLL(用戶在安裝插件時提供它)。
  • 要求將DLL放在System32中或應用程序旁邊可以工作,但它有點混亂,並可能導致卸載程序出現問題。
  • LoadLibraryGetProcAddress當然會起作用,但在我的情況下並不是真的可行。我在其他DLL中使用了數百個,甚至數千個方法。我真的需要使用導入庫。

我曾考慮過在DllMain中使用延遲加載的dll和SetDllDirectory。有沒有人嘗試過這樣的事情?

+1

您使用的是什麼技術? 。淨? – 2010-02-05 09:50:33

+0

你的前提是沒有意義的,並且被打破。 – 2010-02-05 09:53:09

+0

你總是可以將DLL放在System32文件夾中... – Kryten 2010-02-05 10:03:41

回答

4

我能想到3種方法。

  1. 把DLL文件相同的文件夾爲您的應用程序(你不能做到這一點?)
  2. 使用運行時鏈接。 LoadLibrary()GetProcAddress()
  3. 使用清單http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx

但如果DLL是不是在同一個文件夾中的.exe,你怎麼知道它在哪裏?忘了Windows不知道,你怎麼知道

+0

這不是'我的'應用程序,我真的不喜歡安裝到'其他'應用程序的文件夾。清單解決方案聽起來很有趣 - 我會研究這一點。你有更多的參考? – 2010-02-05 11:16:25

1

您可以指定dll的路徑作爲LoadLibrary()的參數。

0

另一種選擇是修改PATH變量。有一個用於啓動主應用程序的批處理文件,並設置PATH =%PATH%;%〜dp0。這確保了最小的佔地面積,運行後系統中不會留下額外的痕跡。