AnsiString从Delphi 2009应用程序中的Delphi 2007 DLL返回值

Tre*_*rsW 4 delphi string dll delphi-2009 ansistring

我有一个用D2007编译的DLL,它具有返回AnsiStrings的函数.

我的申请是在D2009编制的.当它调用AnsiString函数时,它会返回垃圾.

我创建了一个小测试app/dll进行实验,发现如果app和dll都使用相同版本的Delphi(2007或2009)进行编译,则没有问题.但是当一个在2009年和另一个2007年编译时,我得到了垃圾.

我已经尝试在这两个项目中包含最新版本的FastMM,但即使这样,2009应用程序也无法从2007 dll中读取AnsiStrings.

这里出了什么问题的想法?有办法解决这个问题吗?

Rob*_*edy 11

AnsiStrings的内部结构在Delphi 2007和Delphi 2009之间发生了变化.(不要感到沮丧;从第1天起就存在这种可能性.)Delphi 2009字符串维护一个数字,表明其数据所在的代码页.

我建议你做地球上每个其他DLL做的事情,并传递函数可以填充的字符缓冲区.调用者应传递一个缓冲区指针和一个指示缓冲区大小的数字.(确保您清楚是否测量字节或字符的大小.)DLL函数填充缓冲区,写入不超过给定大小,计算终止空字符.

如果调用者不知道缓冲区应该有多少字节,那么您有两个选择:

  • 当输入缓冲区指针为空时,使DLL特别表现.在这种情况下,让它返回所需的大小,以便调用者可以分配那么多空间并再次调用该函数.

  • 让DLL为自己分配空间,使用预定的方法让调用者稍后释放缓冲区.DLL可以导出一个函数来释放它已分配的缓冲区,也可以为调用者指定一些可用的API函数,例如GlobalFree.您的DLL必须使用相应的分配API,例如GlobalAlloc.(不要使用Delphi的内置内存分配函数,GetMem或者New;不能保证调用者的内存管理器知道如何调用,Free或者Dispose即使它是用同一种语言编写的,即使它是用相同的Delphi版本编写的. )

此外,编写只能由单一语言使用的DLL是自私的.使用与Windows API相同的样式编写DLL,您不会出错.

  • @Zartog:这与移植到Delphi 2009没有任何关系,以及在DLL API中使用了不正确的数据类型的一切.试图使用.NET或其他语言的DLL!= Delphi会导致类似的问题.即使没有Delphi 2009的端口,清理代码库也是一个好主意.请参阅"技术债务",例如http://martinfowler.com/bliki/TechnicalDebt.html (2认同)