2012-04-21 51 views
2

我有一個作爲WCF Web服務在IIS7上運行的應用程序。它調用一個COM控件,然後這個控件加載另一個包含數據的dll。此應用程序已使用了相當長的一段時間,通常工作正常,但最近我遇到了LoadLibrary調用加載數據DLL失敗的一臺機器上的問題。但是,調用並不總是失敗,它將在IIS服務重新啓動後用於第一次調用,然後在此之後失敗。爲什麼LoadLibrary調用在第一次工作後會出現'找不到指定的模塊'失敗

數據dll與COM控件存在於同一個目錄中,並且當前目錄設置爲此目錄。我已經檢查並且當前目錄沒有被設置到另一個目錄,它對於這兩個調用都保持不變。單獨的調用是對Web服務的單獨調用,在它們之間,com控件被卸載,數據dll也一樣。

數據DLL加載正常,如果我把它放在系統目錄中或使用com目錄中的DLL的完整路徑,所以我可以解決這個問題,但我只是想知道爲什麼會發生。當我在加載模塊失敗後調用GetLastError時,正如我剛纔提到的,它只是給了我'指定的模塊找不到'錯誤。

LoadLIbrary的MSDN description表示應該搜索當前目錄,並且所有其他已安裝的工作似乎表明它通常會這樣。雖然應用程序以前曾多次在這種類型的機器上運行,但它無法啓動的機器是Windows Server 2008 R2機器。

歡迎任何想法。有沒有辦法讓LoadLibrary枚舉它正在查找的位置?

感謝,
喬丹

+1

您如何檢查以確保當前目錄是一致的?在兩次調用之前,打印消息都是GetCurrentDirectory的結果? – tmpearce 2012-04-21 00:27:17

+0

是的,正好我檢查當前目錄並立即在C++代碼中的LoadLibrary調用之前打印消息,並且我使用_getcwd和GetCurrentDirectory進行了檢查,並且它們都返回相同的東西... – JSoet 2012-04-23 19:02:46

+0

由於您知道它位於哪個目錄,你可以指定完整路徑(作爲解決方法)嗎? – tmpearce 2012-04-23 19:05:44

回答

2

我還沒有發現將枚舉所有的DLL搜索路徑的功能,它看起來相當複雜:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

搜索當前工作目錄的Windows操作庫(除了.exe的位置)是considered a potential security flaw。該文章介紹了一些排除當前目錄的方法,包括SetDllDirectory函數。我不知道IIS是如何工作的,但如果你不控制這個過程,也許別人會篡改搜索設置?我認爲GetDllDirectory會告訴你,如果改變了。

還有一個global registry setting禁用搜索工作目錄,但由於你的負載並不總是失敗,我不得不猜測這不是原因。

+0

是的,我看着它,你說得對,當調用GetDllDirectory,第二次它被設置爲別的......我不知道爲什麼(它似乎是一個oracle目錄),但至少現在我知道,並且符合鏈接中提到的正確搜索順序。謝謝 – JSoet 2012-04-25 18:42:05

相關問題