【问题标题】:Delphi TDataSet in a runtime package运行时包中的 Delphi TDataSet
【发布时间】:2010-11-03 09:45:55
【问题描述】:

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

谢谢

附言我知道使用 Delphi 5 和 BDE 是过时的,但我现在坚持使用它!

【问题讨论】:

    标签: delphi package


    【解决方案1】:

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

    【讨论】:

    • 好的,我刚刚试过了,但是没有区别,错误还是出现
    • TQuery 是否属于其他组件?还是创建为Qry := TQuery.Create(nil)?如果是前者
    • 它不属于任何东西,我用 nil 所有者创建它(因为它所在的类不是从 TComponent 派生的)
    【解决方案2】:

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

    所以,我猜是这样的

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

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

    试试这个:

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

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

    上帝保佑!

    【讨论】:

    • 我刚刚在卸载我的包后尝试创建和使用另一个 tquery,但查询工作正常,关闭应用程序时仍然出现 AV。
    • 我发现如果我将我的 TQuery 连接到包中的 TDatabase 则不会发生错误,除非我在应用程序中也有一个 TDatabase 可以打开。
    【解决方案3】:

    听起来像是单元初始化/完成顺序问题。通常这取决于使用列表中的单位顺序,以及您的包需要哪些包。

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

    步骤

    1. 启动一个不包含你的包的 Delphi
    2. 在 Delphi 中加载你的包
    3. 将包的宿主设置为 Delphi
    4. 使用完整的调试信息编译您的包,并启用“调试 DCU”选项
    5. 运行你的包(它现在应该加载 Delphi,然后是你的包)
    6. 终止德尔福
    7. 在 AV 发生时观察调用堆栈

    您可能希望设置断点来观察您的初始化/完成顺序(请参阅 this post、参考资料和 cmets 进行讨论)。

    然后摆弄你的使用列表和包要求部分。

    --杰罗恩

    【讨论】:

    • 虽然初始化/完成注释似乎有效,但使用 Delphi 技术调试 Delphi 在设计时尝试在 IDE 中查找错误时工作。在这里,他谈论的是在运行时加载包(如 dll),即在应用程序运行时。它与调试 Delphi 组件无关。
    • 我的印象是包与设计时间有关。在运行时调试包时,调试技术同样适用。
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 2010-09-09
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多