Мне нужно написать DLL (с использованием Delphi), которая динамически загружается в приложения Delphi и выполняет запросы RTTI (типичная операция - получение строковых значений для свойств элемента управления).
Классическая проблема заключается в том, что передача строк (и объектов) между приложением и DLL является проблематичной из-за различных менеджеров памяти, используемых в обоих (это может привести к проблемам с памятью, например, диспетчер памяти DLL попытается освободить память, выделенную диспетчером памяти приложения).
Есть ли способ установить диспетчер памяти DLL в диспетчер памяти приложения таким образом, чтобы он не зависел от версии Delphi? Есть мысли?
Октябрь 2010 г. редактировать:
Поскольку интерес к этой теме почти утрачен - я опишу (довольно плохое) решение, которое я выбрал, чтобы другие поняли, почему я не принял ни один из предложенных ответов.
Таким образом, хакерский способ выполнить что-то вроде этого - найти RVA
структуры MemoryManager
(см. Часть реализации System.pas) и жесткий код в DLL. Таким образом, DLL сможет установить свой личный менеджер памяти таким же, как у приложения, в которое он загружается. Это работает с некоторыми ограничениями и проблемами; в любом случае - это зависит от параметров компилятора и компоновщика Delphi.
Хотя это не тот ответ, который я искал, - я не ожидаю ничего лучшего, чем это.