Я возился с идеей использования динамической загрузки 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 на основе клиентских запросов, и приложение передает экземпляры различным модулям для обработки.)