2009-10-15 111 views
3

我正在VS2005中建立一個項目,我的一些DLL沒有註冊。我在Visual Studio中得到的錯誤消息是:爲什麼我的DLL無法註冊?

Project : error PRJ0019: A tool returned an error code from "Registering ActiveX Control..."

這很好模糊。當我通過命令行手動註冊DLL(使用regsv32.exe,我得到以下錯誤:

LoadLibrary("test.ocx") failed - This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix the problem.

我的罪魁禍首.ocx文件跑的Dependency Walker(depends.exe),但它沒有顯示任何明顯的問題。

我也做了重新構建,但我仍然得到了同樣的問題。

任何建議,我怎麼能確定此故障的原因進行登記?

回答

3

微軟最近發佈了ATL安全更新(KB971090)。它不在MSVS2005sp1的基礎上更新,而且它是兼容性時間和運行時兼容性斷路器。檢查你的建築環境是否有這個補丁。

參考文獻:

+0

最後一個鏈接爲+1。這是解釋;我現在已經改變了這個接受的答案。 – LeopardSkinPillBoxHat 2010-02-10 00:18:14

2

也許最簡單的方法解決這個問題的整個類別是安裝Process Monitor from microsoft.com

進程Montior讓您觀察正在進行的系統調用,在這種情況下,您將能夠看到某些系統調用是否失敗。例如,如果缺少依賴項,則CreateFile()調用將被視爲失敗,並將DLL,OCX等作爲文件名。

啓動procmon並配置篩選器以排除regsvr32.exe以外的事件,重現您的測試用例,然後檢查日誌。在返回值列中查找NAME_NOT_FOUND錯誤。

+0

是的,所以很多問題都可以用Pro來診斷監視器。 – sharptooth 2009-10-15 05:23:00

3

最有可能是因爲嵌入式體現。您應該使用資源瀏覽器應用程序並檢查您的DLL是否有嵌入式清單。它可能是一個依賴的DLL(或你的DLL)需要一些不存在的其他DLL的版本。

我收到此消息:「此應用程序未能啓動,因爲應用程序配置不正確。」在嵌入式清單錯配的情況下。

+0

這似乎是迄今爲止最可能的解釋 - 我認爲它與修補程序更新可再發行組件中的DLL有關。您是否還有關於如何檢查我的DLL正在查找哪個版本的可再發行DLL的信息? – LeopardSkinPillBoxHat 2009-10-15 07:08:56

+0

我知道我對VS2005的SP1有問題,它改變了MSVCRT dll的版本。我所做的是檢查依賴關係(例如使用依賴關係walker),然後獲取每個DLL(包括我的)並檢查嵌入式清單(如果有)以查看DLL的版本以及在依賴項的清單中指定的所需版本DLL。最有可能是因爲標準庫DLL修補程序。如果版本不匹配,我不得不重建這些DLL。 – 2009-10-15 07:27:43

0

有幾件事情,你可以嘗試:

  • 嘗試REGSVR32W¯¯啓用/融合日誌(fuslogvw.exe - 它適用於非託管的dll以及)。這會給你更多的信息,而不是依賴於什麼樣的外部依賴被加載,他們從哪裏加載和哪些錯誤被擊中。
  • 將.ocx及其依賴關係複製到根或第一級文件夾並嘗試從那裏註冊。我不記得細節,但是在路徑太深的地方註冊一個COM DLL時存在一個老問題。
  • 根據WinDbg運行regsvr32。設置一個斷點DllMain,看看它是否有什麼奇怪的東西。
  • 如果你永遠不會在WinDbg中使用DllMain,那麼爲你的dll設置一個breakpoint on module load,一旦命中,你可以選擇LoadLibrary,或者設置一個通用的加載庫斷點,然後檢查每個dll。