Delphi TDataSet在运行时包中

时间:2010-11-03 09:45:56

标签: delphi package

我正在创建一个运行时包,其中包含我的主应用程序可以使用的类,但是我遇到了数据访问问题。 我的主应用程序包含一个指向BDE别名的TDatabase。在运行时,我的包被动态加载,并且在包中调用的方法创建TQuery并打开它,用返回的数据填充对象,然后将对象返回到主应用程序。 TQuery使用主应用程序中的TDatabase连接到数据库。 所有这一切工作正常,但当我关闭应用程序时,我得到一个访问冲突:“项目C:... GUI.exe出现错误消息'访问冲突在0x7c9102db:写入地址0x00040ffc'。进程已停止。使用步骤或运行到继续”。 如果我的方法创建了TQuery但没有打开它,则不会发生此错误。我不知道为什么会这样!当我关闭应用程序时,我的TQuery已关闭并释放正常,我的包已卸载好,但在表单被销毁后​​发生错误。 我正在使用Delphi 5 BTW,我试图简短,所以如果我错过任何有用的信息让我知道,任何帮助感激不尽。

由于

P.S。我知道使用Delphi 5和BDE是古老的,但我现在坚持使用它!

3 个答案:

答案 0 :(得分:1)

如果你不释放你的TQuery怎么办?我的意思是,当应用程序终止时,尽量不要释放你的TQuery对象。

答案 1 :(得分:0)

这发生在我使用dbExpress时,终结部分会在数据模块析构函数之前触发,当应用程序被Abort()编辑时会引起很多头痛。

所以,我猜是

  • BDE的连接驱动程序(或其他一些资源)在销毁使用它之前正在最终确定,因此尝试两次完成连接。

我说驱动程序,因为它们通常只按需加载/初始化,因此如果不使用它就不会出错。所以,也许当你的包被卸载时,它会最终确定驱动程序。

试试这个:

  • 加载您的包裹,
  • 使用包中包含的TQuery
  • 卸载您的包裹,
  • 使用在主应用程序中创建的另一个TQuery

并查看这是否有效而不会引发异常。如果它不起作用,那么我想我可能是对的,我们将试图弄清楚如何使这项工作。

上帝保佑!

答案 2 :(得分:0)

听起来像单元初始化/终结订单问题。通常由使用列表中的单位顺序以及您的包所需的包来确定。

尝试解决问题的最佳方法是使用Delphi,或带有.EXE 的软件包调试Delphi。
最后一个很重要,因为如果您开始使用EXE进行调试,旧的Delphi版本将无法始终找到包的符号。

步骤

  1. 启动不包含您的软件包的Delphi
  2. 在Delphi中加载您的包
  3. 将程序包的主机设置为Delphi
  4. 使用完整的调试信息编译软件包,并启用“debug DCU”
  5. 选项
  6. 运行你的包(它现在应该加载Delphi,然后是你的包)
  7. 终止Delphi
  8. 在AV发生时观看调用堆栈
  9. 您可能希望设置断点以观察初始化/最终确定顺序(请参阅this post,参考和评论以供讨论)。

    然后调整您的使用列表和包装要求部分。

    - 的Jeroen