2012-08-28 118 views
4

我有如何調試使用regsvr32.exe進行的64位dll註冊過程?

運行時錯誤216在ADDRESS

註冊用Delphi XE2(I有更新3)內置64位DLL時

從命令提示符下怎麼辦?(注:SYSTEM32文件夾中包含64位的EXE!)

c:\windows\system32\regsvr32.exe My64bitdll.dll 

過了「DLL程序安裝成功的消息」 我有運行時錯誤。

我想調試註冊過程,以某種方式使用運行/參數/主機。

任何人都可以發佈正確的程序嗎?在其他一些問題,如this one提到一個錯誤,但它seems fixed now,我有一個比這個更舊的delphi構建。

更新: 也歡迎對RunTime錯誤的任何評論。

+1

216是在SysUtils初始化之前初始化部分中的訪問衝突,217在SysUtils完成後的最終部分中是相同的。 –

+0

@Marjan你說得對216.但不是217.看看System.pas。 217是'reControlBreak'。而'MapToRunError'將'STATUS_CONTROL_C_EXIT',又名'C000013A'映射到'reControlBreak'。 –

+0

@DavidHeffernan:謝謝檢查。雖然在D5中,但我確信自己已經看到了AV'ing代碼生成的217。實際上,在完成SysUtils之後,仍然有可能在AV上得到217,因爲217在_UnhandledException和_ TABLE_BASED_EXCEPTIONS條件定義中被使用(硬編碼)。這在XE2中。在更多情況下,舊版本可能已經使用了217。事實上,在D2006it中,在_ExceptionHandler中使用了(hardcodedly),這意味着可能已經報告了任何ol異常。 –

回答

5
  1. 加載DLL項目。
  2. 修改運行參數(運行 | 參數)將主機應用程序指定爲regsvr32。請注意,您可能需要使用C:\ Windows \ sysnative路徑來擊敗32位文件系統重定向器。
  3. 將DLL的路徑包含爲命令行參數。
  4. 也許啓用調試DCU,以防在Delphi COM自注冊代碼中引發錯誤。

enter image description here

然後調試像任何其他DLL中的DLL。

運行時錯誤216是訪問衝突。

1

1)此運行時錯誤可能只是程序退出。例如,你會調試DllMain的內部,你可以很容易地獲得過去的退出點,並嘗試追蹤結束的DLL,這將通過RE。進程退出看起來不像從子程序返回 - 而是調用特殊的系統API函數。但調試器不理解它,並繼續追蹤現在已死的項目。

2)我看不到使用RegSvr32.exe或TRegSvr.exe進行調試。所有RegSvr32都會調用DLL中的預定義函數。你調試你的DLL或RegSvr32本身? 2.1)如果後者 - 我聽說有RegSvr32的源代碼,並且可能有調試符號,但是有一些Microsoft調試器需要使用。 2.2)如果是前者,那麼現在應該有區別如何調用這些函數,並且只需要調試這些函數。只需從File not found when registering DLL with TFileRun and regsvr32獲取任何代碼並將其用作主機。

+0

您使用'regsvr32'作爲DLL主機來獲取某些內容來加載您的DLL並調用相應的函數。你可以用另一種方式來做,但這樣做可能是最快的。爲什麼使用不同的主機會讓事情變得更簡單?很明顯,regsvr32不需要調試,所以2.1可以被清理。 –

+0

是的,這會讓事情變得更簡單 - yow會爲您的程序提供調試信息,並且能夠確定從DLL返回並在那裏停止的確切時刻,而不是直到RunTime Error運行所有主機。 *希望你甚至可以調試它像調用DLL的EXE,而不是像黑盒EXE調用的DLL * –

相關問題