gpt4 book ai didi

delphi - 在不同的 Delphi 版本之间发送 TStringList

转载 作者:行者123 更新时间:2023-12-03 19:25:39 25 4
gpt4 key购买 nike

我正在将我的 Delphi 5 源代码迁移到 Delphi 10 Berlin。我的项目中有许多导出功能的 DLL。这些函数是从其他 DLL 调用的。有两个 DLL 我无法迁移到 Delphi 10,但我仍然想在我的程序中使用它们。
这里有一个例子:

function DoSomething( aList: TStringList ): Boolean; external 'Delphi5.dll';

我想从我的 Delphi 10 项目中调用“DoSomething”。但问题是,Delphi 5 中的 TStringList 与 Delphi 10 Berlin(unicode)中的 TStringList 不兼容。当 DoSomething 有一个像 "aString: AnsiString"这样的参数时它会起作用,因为 AnsiString 与 Delphi 5 中的 "string"兼容。

有没有办法在这两个 Delphi 版本之间发送一个列表?也许是 TList 或其他东西?当然,我可以发送一个带有分隔符的 AnsiString 字符串来模拟一个列表,但我想要一个干净的解决方案,因为我有很多这样的导出函数。

谢谢!

最佳答案

如果要在 DLL 内部使用,则永远不应将 EXE 中的对象引用传递给 DLL,反之亦然。只有当 DLL 所做的只是将对象传递回 EXE(反之亦然)时,才能安全地将对象引用传递给 DLL,例如通过回调函数。

如您所见,如果 EXE 和 DLL 不是使用相同版本的 Delphi 编译的,则对象引用无效。即使它们是用相同的版本编译的,我怀疑某些编译器选项可能会使它们不兼容(想到 {$Align},尽管我从未验证过)。即便如此,仍然可能会出现一些不兼容问题(例如 "Cannot assign TStringList to TStringList" 由于 RTTI 不匹配而导致的错误)。

可以通过对代码的最小更改来解决您的问题的方法是更改​​函数的声明以将接口(interface)传递给 DLL,并围绕 TStringList 创建一个包装器。支持该接口(interface)。所述接口(interface)需要支持您需要的所有功能 TStringList .

function DoSomething( aList: IStringList ): Boolean

可以在 DLL/EXE 之间传递接口(interface),而不会出现与对象引用相关的大多数问题(只要它们在编译时使用完全相同的接口(interface)定义)。 (编辑:您仍然需要确保传递给接口(interface)方法的数据可以安全地传递到/从 DLL 传递。)

也就是说,接口(interface)应该显式使用 AnsiString 使用以 null 结尾的 PAnsiChar ,甚至是 WideString (可以安全地发送到/从 DLL - Reference )。
function DoSomething( aListText: PAnsiChar ): Boolean
function DoSomething( aListText: WideString ): Boolean

不要使用 String ,即 AnsiString在 Delphi 5 中,但为 UnicodeString是 Delphi 10。不要使用 AnsiString ,因为由于内部结构差异,它在 Delphi 5 和 Delphi 10 之间不兼容。

关于delphi - 在不同的 Delphi 版本之间发送 TStringList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40003989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com