Я раздумывал над идеей использования динамической загрузки BPL и передачи экземпляров объектов из основного приложения в метод в BPL. Это создает проблему между модулями, используемыми приложением и BPL.
Я написал небольшой прототип, который сделал это, и мне было любопытно, как Delphi внутренне управляет различиями между классами, определенными в приложении, и BPL.
Например, скажем, базовый класс виджетов, например:
TmyWidget = class
private
fId:Integer;
fDescription:String;
public
procedure DoSomething1();
end;
Теперь приложение и BPL построены с использованием модуля, содержащего класс TmyWidget. Позже что-то меняется в TMyWidget, и приложение перестраивается, но BPL нет (или наоборот). Я добавил еще один метод DoSomething2 () и создал экземпляр TmyWidget в приложении и передал его в BPL для обработки и в базовый пример, это сработало. Но это явно чревато потенциальными проблемами.
Если другой динамически загружаемый BPL также использует TmyWidget, все становится еще интереснее. Кажется, это работает, но определенно не кажется идеальным.
Главный вопрос - как обычно передавать объекты в главное приложение и из них, а также из библиотек DLL или BPL? Я никогда не пробовал это раньше и, вероятно, по уважительной причине, но у меня есть идея, которая поддается этому подходу ...
Я предполагаю, что лучший подход - сериализовать объект, передать эти байты и десериализовать его в DLL / BPL, учитывая при этом потенциальные различия версий между хостом и динамически загружаемым модулем, но я надеялся, что новый SimpleSharedMem опция может принести эту новую функциональность без накладных расходов на сериализацию, но она кажется не очень полезной, если только вы не строго соблюдаете перестройку приложения и dll при любых изменениях общего кода ... но в этом прототипе приложение будет оставаться довольно постоянным и динамически загружаемые модули будут часто меняться с добавлением функций в TmyWidget. (Серверное приложение служит фабрикой для создания TmyWidget на основе клиентских запросов, и приложение будет передавать экземпляры в различные модули для обработки.)