簡體   English   中英

運行時包中的Delphi TDataSet

[英]Delphi TDataSet in a runtime package

我正在創建一個運行時包,其中包含主應用程序可以使用的類,但是我在數據訪問方面遇到問題。 我的主應用程序包含一個指向BDE別名的TDatabase。 在運行時,我的包會動態加載,並且在包中調用的方法會創建一個TQuery並將其打開,並使用返回的數據填充對象,然后將該對象返回到主應用程序。 TQuery使用主應用程序中的TDatabase連接到數據庫。 所有這些工作正常,但是當我關閉應用程序時,我遇到訪問沖突:“項目C:... GUI.exe出現錯誤消息,提示“訪問沖突在0x7c9102db:寫入地址0x00040ffc”。進程已停止。使用“執行步驟或運行到繼續”。 如果我的方法創建了TQuery但沒有打開它,則不會發生此錯誤。 我不知道為什么會這樣! 當我關閉應用程序時,我的TQuery已關閉並被釋放,我的包已被卸載,但是在銷毀表單后,會發生錯誤。 我使用的是Delphi 5 BTW,我盡量簡短,因此,如果我錯過了任何有用的信息,請告訴我,我們將不勝感激。

謝謝

ps:我知道使用Delphi 5和BDE是過時的,但是我現在仍然堅持使用它!

如果您不釋放自己的TQuery怎么辦? 我的意思是,當應用程序終止時,請不要釋放您的TQuery對象。

這是我使用dbExpress發生的,在應用程序進行Abort()編輯時,終結處理部分會在數據模塊析構函數之前觸發,這會引起很多頭痛。

所以,我的猜測是

  • BDE的連接驅動程序(或其他資源)在銷毀使用該驅動程序的東西之前就已完成,因此嘗試兩次完成連接。

我說驅動程序是因為它們通常僅按需加載/初始化,因此如果不使用它也不會出錯。 因此,也許當您的軟件包被卸載時,它會最終確定驅動程序。

嘗試這個:

  • 加載您的包裹,
  • 使用包中包含的TQuery,
  • 卸貨
  • 使用在主應用程序中創建的另一個TQuery,

並查看這是否有效而不會引發異常。 如果它不起作用,那么我想我可能是對的,我們將嘗試找出如何使它起作用。

上帝保佑!

聽起來像是單元初始化/完成訂單問題。 通常,這取決於使用列表中的單位順序以及包裝所需的包裝。

解決該問題的最佳方法是使用Delphi調試Delphi, 或使用.EXE調試程序包
最后一個很重要,因為如果您開始使用EXE進行調試,則較早的Delphi版本將無法始終找到包的符號。

腳步

  1. 啟動一個不包含您的軟件包的Delphi
  2. 在Delphi中加載你的包
  3. 將您的軟件包的主機設置為Delphi
  4. 使用完整的調試信息編譯您的軟件包,並啟用選項“調試DCU”
  5. 運行您的程序包(現在應該先加載Delphi,然后再加載您的程序包)
  6. 終止Delphi
  7. 當AV發生時觀看呼叫堆棧

您可能想要設置斷點來監視初始化/完成順序(有關此內容的討論,請參閱本文 ,參考資料和評論)。

然后擺弄您的使用清單和包裝要求部分。

--jeroen

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM