Отправка TStringList между различными версиями Delphi

Я переношу свой исходный код Delphi 5 в Delphi 10 Berlin. У меня есть много DLL в моем проекте, которые экспортируют функции. Эти функции вызывают из других DLL. Есть две библиотеки DLL, которые я не могу перенести на Delphi 10, но я все еще хочу использовать их в своей программе. Вот пример:

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

Я хочу назвать «DoSomething» из моего проекта Delphi 10. Но проблема в том, что {$ Align} в Delphi 5 несовместим с «Невозможно назначить TStringList для TStringList» в Delphi 10 Berlin (unicode). Это будет работать, когда у DoSomething будет такой параметр, как «aTStringList: TStringList», потому что функция DoSomething ( aList : IStringList ): Boolean совместима со строкой в ??Delphi 5.

Есть ли способ отправить список между этими двумя Delphi-версиями? Возможно, TList или что-то еще? Конечно, я могу отправить AnsiString с разделителем между строками для имитации списка, но я хочу чистое решение, потому что у меня есть многие из этих экспортных функций.

Благодаря!

delphi,dll,delphi-5,delphi-10.1-berlin,

1

Ответов: 1


4 принят

Никогда не следует передавать ссылку на объект из EXE в DLL, если она предназначена для использования внутри DLL, или наоборот. Ссылка на объект может быть безопасно передана в DLL только в том случае, если вся DLL передает объект обратно в EXE (ro наоборот), например, через функцию обратного вызова.

Как вы видели, ссылка на объект недействительна, если EXE и DLL не скомпилированы с той же версией Delphi. Даже если они скомпилированы с той же версией, я подозреваю, что некоторые параметры компилятора могут сделать их несовместимыми ( PAnsiCharприходит на ум, хотя я никогда не проверял его). И даже тогда могут возникнуть некоторые несовместимости (например, WideStringошибки из-за несоответствий RTTI).

Что-то, что могло бы исправить вашу проблему с минимальными изменениями в вашем коде, - это изменить объявление своих функций, чтобы передать интерфейс DLL, и создать оболочку TStringList, поддерживающую этот интерфейс. Указанный интерфейс должен поддерживать все необходимые функции TStringList.

function DoSomething( aListText: PAnsiChar ): Boolean

Интерфейсы могут передаваться между DLL / EXE без большинства проблем, связанных с ссылкой на объект (при условии, что они используют точное определение интерфейса при компиляции). (Изменить: вам все равно необходимо обеспечить, чтобы данные, переданные методу интерфейса, безопасны для передачи в / из DLL. )

Тем не менее, интерфейс должен явно использовать AnsiString, используя нуль-конец или даже (который можно безопасно отправлять в / из DLL- Reference ).function DoSomething( aListText: WideString ): BooleanString

AnsiString

UnicodeString

Не используйте String, что находится AnsiStringв Delphi 5, но это AnsiStringDelphi 10. И не используйте AnsiString, поскольку он несовместим между Delphi 5 и Delphi 10 из-за различий в внутренней структуре.

Дельфы, DLL, Дельфы-5, Дельфы-10.1-берлин,
Похожие вопросы