Delphi在dll中形成

时间:2011-04-27 13:56:24

标签: delphi

在dll中放置具有完整功能的表单是否是个好主意。 主应用程序将调用返回表单对象的dll函数。

5 个答案:

答案 0 :(得分:7)

Delphi中可接受的方法是使用包而不是DLL。

包本质上是DLL,但具有Delphi特定功能,允许跨包边界使用VCL对象。

尝试使用DLL执行此操作将导致程序包处理的各种问题。软件包的一个缺点是必须使用相同版本的Delphi编译所有模块。但是,如果您想跨模块边界共享对象,那么如果使用DLL,则会遇到相同的限制。

Delphi文档涵盖了packages

说了这么多,我想补充一点,如果你可以将所有代码放入一个单独的模块(.exe或.dll)中,那么它确实会让生活变得更加简单。

答案 1 :(得分:5)

添加有关使用包的答案:

  • 只有在主应用程序和所有dll(插件)都是用Delphi 编写并且使用相同版本的Delphi编写时才能使用包
  • DLL可以用任何可以创建它们的编程语言编写,并且可以被任何程序使用,而不管编程语言如何

因此,使用dll而不是包是有意义的。

关于实际问题:是的,可以将表单放入dll中,它们通常可以正常工作。只要确保你没有传递它们,因为它们只是dll上下文中的有效对象。对于失去焦点或落后于其他形式的表格,您将遇到奇怪的问题。这通常可以通过将窗口句柄从主可执行文件传递到dll来修复,然后将其用作表单的父级。

另请注意:您的dll的TObject与应用程序的TObject不同。这同样适用于其他常用的类和变量,如(Forms。)Application。

我已经做到了,腰背部疼痛但并非不可能。主程序是用Visual Basic 6编写的,有些模块是用Delphi 6编写的,有些是用Delphi 7和Delphi 2007编写的。

结论:如果您确定永远不会为您的应用程序和dll(插件)使用与Delphi不同的东西,并且愿意在切换Delphi版本时始终重新编译所有内容,则应使用软件包。否则,使用常规dll可能会更好。 (你确定你将永远是唯一一个写这些dll的人吗?也许在某个时候会有一个第三方开发者为其中一个不拥有他需要的Delphi版本的dll。)

答案 2 :(得分:2)

对于David Heffernan所说的一切都是+1。

从战略上讲,如果您正在实施插件系统,那么您实际上只需要 来实现外部文件中的表单(或其他功能)。

如果您要允许使用任何语言编写插件,那么DLL是唯一的方法。

如果您的插件系统仅限于具有相同版本Delphi的开发人员(也许是同一个团队?),那么请选择BPL。从我的角度来看,Delphi软件包的另一个缺点是需要在您的应用程序中部署VCL BPL,这些软件总是比单个编译模块更多Mb。

另一方面,如果你想编写一个模块化系统,你仍然可以通过实现松耦合& amp;代码中的“插件”技术,仍然可以编译为单个模块。

答案 3 :(得分:2)

IMO这有时是一个非常好的主意,也是唯一的出路 - 由于其他人提到的原因,我不喜欢软件包,并且对DLL非常熟悉。我目前正在使用Delphi XE为Delphi 5编写的应用程序添加功能 - 它要么使用DLL,要么在D5中编写 - 当然我选择了前者:D5 app调用在XE中编写的包含所有最新和最强大功能的DLL。 (我在Delphi中做的第一个项目是通过旧的Borland Paradox完成的 - Paradox应用程序调用了用Delphi 1编写的DLL!)

但是,我不会将DLL中的表单或模块发送回主应用程序 - 我只是向DLL模块发送一个结构,其中包含完成其工作所需要知道的内容,以及何时完成以及DLL的形式关闭,它清理然后返回一个数字代码或结构回到调用者指示成功,失败等(老式但非常有效)。

通过DLL阈值将表单实例从DLL传递回主应用程序可能会有问题 - 请注意@dummzeuch上面的优秀答案以及如果您认为这是唯一的解决方案,如何协商其中一些问题的一些好的提示。

答案 4 :(得分:0)

如果您将表单放在普通dll中,表单将无法拦截TAB或箭头键。我被告知这是因为OnKeyDown不能通过。