【问题标题】:Tform.create (owner) in a dll applicationdll 应用程序中的 Tform.create(所有者)
【发布时间】:2017-12-26 17:29:59
【问题描述】:

当创建一个新表单时,Delphi 期望“Application”、“self”或“nil”作为定义所有者的参数。但是当表单位于 dll 而不是独立 (vcl) 应用程序中时会发生什么?显然,'nil' 由 dll 中编写的代码处理。但是,如果表单是在 dll 中创建的,我不清楚“Application”或“self”是否会正确处理“form.free”操作。如果是这样,表格是否被释放?

【问题讨论】:

  • 预计在 DLL 中实现 VCL 表单将面临更大的挑战。 Application 将与应用程序中的不同。
  • "Delphi 期望 'Application'、'self' 或 'nil' 作为定义所有者的参数" - 它没有这样的期望。您可以使用any TComponent 对象作为Owner,如果不是nil。但是,如果您确实指定了nil,则您有责任在使用完毕后自行释放创建的对象。
  • 为什么会有人想要在(普通)DLL 中实现表单?为此,包 (BPL) 更适合。 DLL 不会遇到任何问题。
  • @rudy 有时候。例如,假设您为办公应用编写了一个 COM 插件。
  • @rudy 该 dll 用作图形 CAD 程序的宏扩展。宏可以使用弹出表单来管理从程序中提取的数据并定义新实体以添加到绘图文件中。 Delphi 软件包无法识别。 dll 由 Cad 程序操作,仅导出一个名为“名称”的函数。

标签: forms delphi


【解决方案1】:

当创建一个新表单时,Delphi 期望 'Application'、'self' 或 'nil' 作为参数来定义所有者。

这是不正确的。任何组件都可以作为所有者提供,并且当所有者被销毁时,拥有的组件也会被销毁。

如果表单是在 dll 中创建的,我不清楚“Application”或“self”是否会正确处理“form.free”操作。如果是,何时释放表单?

在这两种情况下,当所有者被销毁时,表单也会被销毁。所以问题就变成了,很简单,所有者什么时候被摧毁。答案是:

  • 应用程序:当 DLL 被卸载时。在 DLL 中,有一个 Application 对象,但它的生命周期与 DLL 而不是可执行文件的生命周期相关联,就像在 VCL 可执行模块中的情况一样。
  • 自我:每当Self 被破坏时,只有你知道,因为只有你知道Self 是什么。

【讨论】:

  • 谢谢,我认为没有简单的方法可以确定程序是否已卸载 dll。在这种情况下,我最好的选择是使用“nil”并自己处理释放表单。
  • @Ashlar 当然有。如果您动态加载 DLL,那么您也将负责卸载它。所以你会是一个知道的人。除非您的 DLL 是由第三方应用程序加载的,否则您的问题并不清楚。如果是这种情况,那么我希望调用者有一个卸载/释放内存的机制,如果它设计正确的话。一些开发者假设你有垃圾收集,并没有提供释放它的方法。
  • @Jerry 单元最终确定发生在 DLL 卸载时,这只是一种无需任何合作即可检测到这一点的方法。
  • @Ashlar 如果您需要建议和指导,那么我们需要知道 dll 的使用和托管方式。
  • @David 确实如此,只是我一直假设 DLL 将由 OP 自己的应用程序托管,但上面的评论另有说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多