2013-04-24 110 views
1

靜態鏈接不是一個選項。依賴於其他DLL的DLL?

假設我有一個依賴於DLL的可執行文件。一種解決方案是將DLL與可執行文件一起發佈到相同的文件夾中。現在我們假設我需要將DLL注入到依賴於DLL的進程中。由於DLL被注入,我會在哪裏放置它依賴的DLL?在同一個文件夾中?或者在注入進程的目錄中?

回答

4

取決於一個或多個其他DLL的DLL並不是特別的。即使是一個微不足道的DLL也會依賴於駐留在其他DLL中的Windows共享組件。這些「共享組件」的一個很好的例子是Kernel32.dll和CRT DLL如MSVCR80.DLL

你可以找出究竟哪些其他的DLL你的DLL或EXE通過調用Dependency Walker要求上。爲此,只需從Visual Studio命令提示符運行depends.exe,然後將感興趣的DLL拖放到出現的窗口中即可。如果您沒有可用的依賴性助手,可以從上面的鏈接下載它。

我不確定DLL注入的東西,但它應該通常是足夠的,如果您將所有(其他DLL)依賴項放在與您的DLL相同的文件夾中,這將是EXE加載這些文件夾DLL駐留。

例如:如果需要C:\test\foo.exebar.dll(這又要求baz.dll,假設baz.dll不是一個標準窗口共享組件),那麼你將置於C:\testbar.dllbaz.dll

操作系統如何確定要加載哪個DLL還有很多,因爲同一個DLL的多個版本可能存在於不同的位置,並且MSDN在動態鏈接庫的搜索順序上有一個有用的article

+0

是的,將它們放在同一個文件夾中是標準做法。如果您絕對需要將它們放在其他地方,請調用SetDllDirectory函數來修改應用程序的默認搜索順序。很好的答案! – 2013-04-24 04:41:44