如何在DLL中传递和返回对象?

时间:2009-11-04 20:59:58

标签: delphi dll

我需要将用Delphi制作的DLL中的对象返回给Delphi制作的应用程序。目标是做一个可以在将来修改的子系统,而无需修改主应用程序。所以,我想在DLL中开发子系统是一个(好??)的想法...我在Windows XP,Delphi 7中编程。我确实读过DLL只返回基本数据类型,但必须要有办法做该...

最好的问候。

4 个答案:

答案 0 :(得分:2)

我更喜欢将COM应用于这样的模型,它允许您创建外部“对象”,然后您可以在应用程序中引导它们。在Delphi中创建COM对象非常简单,使用ActiveX创建方法创建ActiveX库,然后创建COM对象。然后在主应用程序中使用接口单元,当您CoCreate对象的实例时,它会加载相应的DLL。唯一棘手的部分是你的com对象必须在系统上注册才能正常运行......在Win7 / Vista世界中需要提升访问权限......尽管一旦完成,它就是无缝的。

答案 1 :(得分:2)

您可以使用接口和大多数问题,编译器/ rtl版本甚至其他语言都会消失。 Delphi的接口始终与IUnknown兼容,这使它们与Windows上大多数支持OO的语言兼容。

要注意的一件事是:不要使用AnyString,坚持使用WideString,这是COM使用的Stringtype。

答案 2 :(得分:1)

最佳方式是使用skamradt建议的COM包装器。

有可能,但not a good idea将对象引用作为DLL的指针传递。请特别参考Peter Haas的评论。

如果您确实将对象从Delphi DLL传递到Delphi应用程序,您将遇到以下问题:

您必须为app和DLL使用相同版本的Delphi。

app和DLL必须具有相同的对象实现 - 或者至少是类中所有字段的相同布局 - 如果使用标准对象(如TStringList),则可以。

您应该使用共享内存或运行时包,否则会出现奇怪的访问冲突。

我必须维护代码才能完成 - 这是一种噩梦,因为如果不进行大量的重新编译就无法更改类。

答案 3 :(得分:0)

独立于平台和语言的方式可以是交换序列化对象。

它会对性能产生影响,但它也有优势:DLL无需使用其他语言和平台(如.Net或Java)(通过JNA Java Native Access))进行修改。它不依赖于操作系统的任何特殊功能因此,如果使用Free Pascal编译库,它也可以在Linux或MacOS上使用。

对于序列化,您可以使用JSON或XML。 Delphi有开源库,例如SuperObjectOmniXML