如何将对象传递给DLL或从中传回对象?

问题描述:

我需要将Delphi中制作的DLL中的对象返回到Delphi中制作的应用程序中。目标是做一个可以在未来修改主应用程序的子系统。所以,我想象开发一个DLL中的子系统是个好主意......我在Windows XP,Delphi 7中进行编程。我确实读过DLL只返回基本数据类型,但必须有一种方法可以做那...如何将对象传递给DLL或从中传回对象?

此致敬礼。

+6

这有已经在*上讨论了几次*。搜索标有[delphi]和[dll]或[bpl]的问题。可以说没什么新鲜的话题可以说... – mghie 2009-11-04 21:09:30

+0

哦!伟大的答案男人!以及如何在数百个答案中找到一个良好的答复? – DelphiProgrammer 2009-11-04 22:17:12

+1

看看http://*.com/questions/1596704/how-to-return-an-instance-from-a-dll – 2009-11-04 22:50:07

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

BEST方法是使用skamradt建议的COM包装器。

这是可能的,但not a good idea传递对象引用作为DLL的指针。特别提到彼得哈斯的评论。

如果你通过从德尔福DLL的目的是Delphi应用程序,你将有以下的问题:

您必须使用Delphi的相同版本的应用程序和DLL。

应用程序和DLL都必须具有相同的对象实现 - 或者至少具有类中所有字段的相同布局 - 确定是否使用标准对象,如TStringList。

你应该使用共享内存或运行时软件包,否则你会得到奇怪的访问冲突。

我不得不在维护代码的地方完成这个任务 - 这很噩梦,因为如果没有很多重新编译的话就无法更改类。

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

有一点要记住,不过:不要使用AnyString,坚持WideString,这是COM使用的Stringtype。

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

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

对于序列化,你可以使用JSON或XML。有开放源码库德尔福,例如SuperObjectOmniXML

+0

如何使用delphi将序列化对象从/传递到application/dll。你有没有关于它的例子(用SuperObject)? – Martin 2012-12-20 09:04:28