Никогда не следует передавать ссылку на объект из 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 ): Boolean
String
AnsiString
UnicodeString
Не используйте String
, что находится AnsiString
в Delphi 5, но это AnsiString
Delphi 10. И не используйте AnsiString
, поскольку он несовместим между Delphi 5 и Delphi 10 из-за различий в внутренней структуре.