2012-07-30 101 views
5

當我試着使用LoadLibrary project.dll失敗。指定的模塊找不到

regsvr32 project.dll 

我得到這個錯誤登記我的C++/ATL項目的32位版本:

LoadLibrary("project.dll") failed - The specified module could not be found 

project.dll是我的DLL使用Visual Studio 10上的ATL構建。

64位版本註冊正常。

我錯過了什麼?

+0

where project.dll?在與您調用此命令的位置相同的目錄中?在PATH中? – stijn 2012-07-30 07:51:08

+0

是的,它是在同一目錄(否則我會得到一個錯誤,說沒有這樣的文件存在!) – Danield 2012-07-30 07:57:16

+2

然後打開在依賴沃克的DLL,看看什麼DLL丟失 – stijn 2012-07-30 08:01:30

回答

5

我觀察到完全相同的錯誤,但解決方案未安裝可再發行組件。根據depend.exe,所有依賴DLL都存在於系統中。

在我的情況下,KERNEL32.DLL的圖標稍帶紅色。 Depends.exe並沒有提供太多的解釋,但是四處挖掘,發現系統中DLL中缺少一個導入的函數。要查看導入的函數,請在樹視圖中選擇相關DLL ,然後在右側面板中查找導入。按PI列排序以查看缺少進口的紅色圖標。

Seeing the missing import

在我的情況下,缺少的功能是沒有我的悲傷目標操作系統中,Windows XP上存在的函數。由於我的程序沒有直接依賴於這個功能,我能夠與#define荷蘭國際集團在我的項目下列閃避:

#define WINVER 0x0501 
#define _WIN32_WINNT 0x0501 

與這些宏編譯說得那麼有問題的功能在頭未聲明,因此不會在加載時導入。現在我可以使用regsvr32。這當然是一個非常具體(幸運)的案例。我不依賴那個進口或任何其他更新的API,所以我可以逃避重新定位項目。如果它不是一個系統DLL,我將需要找到一個更新的版本,這很容易導致需要更新依賴圖的整個子樹。或者更糟糕的是,如果我依賴缺失的進口產品,則需要進行一些嚴重的重構。

概括起來,可以由以下問題導致此錯誤消息:

  1. 的DLL文件未找到或無法讀取。檢查命令行。
  2. 某些依賴DLL未找到或無法讀取。
  3. 某些依賴的DLL中缺少某些導入。如果這些是系統DLL,則可能是針對錯誤版本的Windows。如果這些是非系統DLL,則需要安裝它們的較新版本及其所有依賴項。

1:除了IESHIMS.DLL和WER.DLL這顯然是在這個古老工具的錯誤。
2 .:或者真的,加載DLL在特定系統上的任何問題

+0

雖然我不工作在那個項目上,並沒有能力檢查出來,這似乎是解決這個問題的正確方法。 +1 - 謝謝! – Danield 2014-09-30 08:48:02

2

錯誤描述在這種情況下是誤導性的。系統找到您的DLL(project.dll),但您的DLL的一個(或多個)依賴項可能會丟失。

+2

檢查你的DLL(32位版本)與依賴沃克http://www.dependencywalker.com/)可能會幫助 – mox 2012-07-30 08:00:46

+0

我試過了,它顯示有些dll丟失了,但是當我下載這些dll並將它們添加到與項目dll相同的目錄時 - 每次找到目錄walker一套新的dll缺失 – Danield 2012-07-30 08:57:26

+1

事實上,一些圖像具有子依賴關係!所有靜態依賴關係(直接和間接)必須在Windows加載器啓動(在您的情況下注冊)應用程序之前解決。 – mox 2012-07-30 09:00:12

1

我剛安裝

Microsoft Visual C++ 2010 Redistributable Package 

,現在我可以安裝DLL。

儘管這樣可行,但我對此並不滿意,因爲我不想將這個軟件包安裝在客戶端上,以便讓我的dll工作。

+0

我剛剛注意到,在我使用的安裝程序中,有一個選項可以包含此軟件包作爲先決條件 - 因此如果用戶尚未安裝該軟件包,安裝程序將繼續並下載軟件包 – Danield 2012-07-30 09:46:09

相關問題