2009-10-23 52 views
4

我在包含它所使用的DLL的應用程序目錄中有一個C++ Exe。現在,爲了某些測試目的,我需要修改現有的DLL並使用它來代替原來的DLL。但爲了不修改現有安裝,我無法備份現有的DLL並將其替換爲修改後的DLL或將其移動到其他位置。我也不能改變Exe。這2個DLL需要並排存在。唯一的變化應該是Exe應該透明地加載在其他文件夾中的修改的DLL,而不是與Exe相同的文件夾中的現有DLL。有沒有一些優雅的做法呢?Windows:更改DLL的DLL搜索順序

我看了一些MSDN文章,但找不到這樣做的方法。該解決方案應該可以在Windows XP上運行。

回答

-1

我知道的唯一方法是使用包含路徑的LoadLibrary API,但是你說你不能更改exe。

1

根據MSDN,它將始終由應用程序目錄開始(除非您使用備用搜索順序方法修改它),所以它似乎很難。您仍然可以在其他地方複製可執行文件和其他依賴項。雖然這不是那麼優雅。

或者您可以從原始目錄中啓動您在其他位置與新DLL一起復制的可執行文件。根據搜索順序,它也應該工作,但我必須承認我從來沒有嘗試過。

0

您可以從頭開始爲您的進程鉤掛LoadLibrary()調用。當你的補丁版本的LoadLibrary()看到你的DLL時,它會調用帶有修改的DLL路徑的原始LoadLibrary()。即使你不使用LoadLibrary()調用來加載你的DLL,Windows CRT也會這樣做。所以這種技術必須工作。

+0

能否請你解釋一下它是如何工作的,謝謝 - gg – 2009-10-27 00:44:13

+0

MSalters描述的方式是你應該嘗試的第一種方式。這是執行DLL注入的最簡單方法。 如果它不起作用(我沒有看到這個原因),那麼你應該實現一個真正的API掛鉤。這是一個複雜的話題來描述。您可以通過在Web上搜索「Windows API掛接」主題來獲得一些示例代碼和實用程序庫。 – 2009-10-29 01:45:27

2

Windows將在每個進程中爲每個DLL名稱加載至多一個版本。如果它加載了在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs中列出的DLL,它將在稍後加載類似名爲的DLL。但是在AppInit_DLLs中,您可以使用顯式路徑列出DLL,並覆蓋正常的LoadLibrary()順序。

因此,暫時將您的測試DLL放入AppInit_DLLs,它會覆蓋其他任何具有相同名稱的DLL。