【发布时间】:2016-10-12 16:43:46
【问题描述】:
我正在将我的 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 中的 TStringList 不兼容(unicode)。当 DoSomething 有一个像 "aString: AnsiString" 这样的参数时它会起作用,因为 AnsiString 与 Delphi 5 中的 "string" 兼容。
有没有办法在这两个 Delphi 版本之间发送列表?也许是 TList 或其他东西?当然我可以发送一个带有分隔符的 AnsiString 字符串来模拟一个列表,但我想要一个干净的解决方案,因为我有很多这样的导出函数。
谢谢!
【问题讨论】:
-
设计存在重大缺陷。您永远不应该跨越 DLL 边界传递对象。如果由我决定,我会完全重新设计它以传递原始数据。甚至可能类似于
FindFirst/FindNext。 -
如果您的程序曾经成功,那只是偶然。您需要重新设计界面。
-
更不用说,你使用了错误的调用约定。
-
@Jerry 只要双方使用相同的调用约定就可以了
-
原始代码和设计并非来自我。这是一个非常大的项目,我尝试将其迁移到 Delphi 10。我不得不忍受一些设计错误,因为更改它们需要太多时间。跨 DLL 传递对象在项目中工作正常。在 DLL 或 EXE 和 DLL 之间进行通信的最佳方式是什么。 COM?
标签: delphi dll delphi-5 delphi-10.1-berlin