2012-10-30 104 views
1

我有一個Visual C++ 6項目正在創建一個COM DLL。這是一個我多年以來沒有用過的舊項目,但我最近回到它來更新DLL的一些功能。我遇到的問題是,當我嘗試手動註冊由項目創建的DLL(使用regsvr32)時,我什麼也得不到迴應。它沒有說它成功了,它並沒有說它失敗了。我已驗證該DLL未被添加到註冊表中。我從來沒有見過regsvr32的情況,當它不顯示任何確認消息。Visual C++ ATL Com註冊問題

此外,該DLL被設置爲在項目中自注冊,並且當它嘗試執行此操作時,它也不會顯示消息。

我很久沒有碰過這個項目,但是我最後一次碰觸它,它沒有問題。現在我回到它,突然間我有這個問題。就好像由Visual C++項目創建的DLL與當前版本的Windows不兼容。我已經將開發軟件更新到SP6,但並沒有改變這種情況。

我跑取決於REGSVR32當它被指向所創建的DLL,它顯示了這樣的信息:

LoadLibraryExW( 「C:\ Source32 \ BIS \項目\ ALFA \ DigiPixSvc \ DigiPixObj \調試\ DigiPixObj」 ,0x00000000,LOAD_WITH_ALTERED_SEARCH_PATH)返回NULL。錯誤:操作系統無法運行%1(182)。

任何人都可以請告訴我爲什麼會發生這種情況,我能做些什麼來糾正它?

+0

你在使用什麼操作系統?你是否想以管理員身份運行regsvr32? – xxbbcc

+0

操作系統是Windows XP SP3。我在運行regsvr32時以管理員身份登錄。 –

+0

你可以在'DLLRegisterServer()'中放置一個斷點,然後調試運行regsvr32時會發生什麼? – xxbbcc

回答

0

免責聲明:由於我沒有安裝VS 6.0,我必須使用一些Google搜索爲您提供VC 6.0對話框的確切步驟 - 所以這些信息可能有些不準確。我相信這是正確的 - 這實際上是你在當前的IDE中做的,只是爲了使用VC 6.0。

在經歷調試DLL的麻煩之前,請確保您通過Dependency Walker運行它,以驗證您的所有依賴項都在您的機器上。請勿在regsvr32上運行Dependency Walker - 重要的是您的DLL是否有其依賴關係。如果他們缺少,regsvr32將無法加載DLL。

要試圖在您嘗試註冊DLL時被regsvr32加載,您需要通過DLLRegisterServer()函數進行調試,看看會發生什麼 - 這是COM DLL必須具有的4個入口點之一,以及regsvr32當DLL即將被註冊時調用這個函數。爲此,您必須將regsvr32設置爲項目的啓動程序,並將完整路徑作爲regsvr32的命令行參數傳遞給調試構建的DLL。

  • 帶來項目屬性爲您的項目。
  • 轉至調試選項卡。
  • 確保已選擇常規類別。
  • 輸入調試會話文本框的可執行文件中regsvr32的完整路徑。
  • 程序參數文本框中輸入DLL的調試版本的完整路徑。確保你的DLL有一個PDB文件,這樣你可以在調試過程中看到符號信息。
  • DLLRegisterServer()的第一行放置一個斷點。此功能中的代碼可能長或短,具體取決於它是如何創建的:由開發人員編寫的嚮導生成,等等。
  • 開始調試。

你應該打斷你的斷點,你應該能夠逐步通過註冊碼,看看它在哪一點失敗。

+0

我發現這個問題,那就是有一個依賴DLL綁定到我的DLL使用的靜態庫。靜態庫已被正確更新,但舊版本的依賴關係DLL位於構建目錄中,尚未更新以匹配更新的靜態庫。當我使用最新的依賴DLL時,regsvr32表示它正確地註冊了我的DLL。 –

+0

@BrianDaniels我很高興它解決了。 – xxbbcc

+0

是的,謝謝你的幫助。你在回答中所說的話最終導致我追蹤這個問題。 –