10 年前,我使用 Matlab Compiler 創建了幾個 DLL,使用 C 包裝器,以使它們可用于 Delphi。一旦我讓他們作業,他們總是作業 - 直到今天!有問題的 C 包裝器初始化函式中的代碼在下面的代碼框中;當我運行我的 Delphi 應用程式時,“無法初始化庫”會列印到控制臺。
mclmcrInitialize();
if (!mclInitializeApplication(NULL, 0)) {
fprintf(stderr, "Could not initialize application\n");
}
if (!libMyDllInitialize()) {
fprintf(stderr, "Could not initialize library\n");
}
問題是這種情況以前從未發生過,自從我們第一次寫這些以來可能已經有 10 年了!我的機器安裝了正確版本的 32 位 2021a MCR,這已經有好幾年了;我已經在從 Windows XP 到 Windows 10 的多臺機器上安裝了它,這些 DLL 最后一次構建是在 5 到 7 年前;無論如何,我再也無法訪問 Matlab 編譯器了。唯一改變的是我的應用程式,但在呼叫此 DLL 初始化代碼的位置附近沒有;此外,當問題第一次發生時,我的應用程式正在運行,然后沒有 - 沒有任何更改。最后,我回去幾天并重建了我的應用程式,它仍然失敗。
所以我真的被困住了,需要一些高級幫助來除錯 Windows 上的 DLL 啟動問題。我嘗試查看 Windows 事件記錄器,但那里似乎沒有任何顯示。要檢查的日志?注冊表中的某個設定以某種方式被沖洗掉了?月相錯誤?當被迫將其視為黑盒時,如何除錯加載/初始化以前作業的 DLL?幫助!
uj5u.com熱心網友回復:
如何除錯加載/初始化以前作業的 DLL [...]?
我認為你的問題沒有明確的答案。
這就是我們除錯 DLL 和應用程式的加載/初始化的方式,可能會對您有所幫助:
我們經常使用沒有 DLL 源代碼的系統(通常我們也沒有任何應用程式的源代碼)。我們經常遇到 DLL 沖突。在測驗應用程式未按預期啟動的原因時,我們發現Mark Russinovich 使用 Sysinternal 的 Process Monitor非常寶貴。
這將向您顯示系統級活動。您可以過濾您的行程,然后您將看到所有檔案、注冊表、執行緒和網路活動(盡管執行緒和網路非常有限)。如果 DLL 具有依賴關系,那么系統會嘗試找到它們,因此您將能夠發現它正在尋找的所有依賴 DLL 和 COM 介面(通過查看該介面的注冊表查找)。行程監視器將顯示資源是否未找到或訪問是否被拒絕。
稍微難以發現的是,是否存在依賴項之一但匯出表已更改(因此函式具有不同的簽名或匯出序號)。有一些方法可以檢查(通過查看匯出和匯入表),但通常(如果您可以訪問作業環境)檢查DLL 之間的檔案大小、時間戳(以及VERSIONINFO 資源,如果有的話)就足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433766.html
上一篇:使用Delphi11在Android應用中訂閱Firebase云訊息傳遞的主題
下一篇:可以按名稱更新TRecord成員
