Если честно, то не совсем разобрался, как можно использовать метод Assign в моей ситуации.
Но вопрос уже снят: как оказалось, он был неактуален)) Поясню, если вдруг у кого будут аналогичные проблемы.
Все дело в том, что я как раз использую присвоение значения, а не не копирование. Поэтому все мои переменные (и та, что в dll, и те обе, что в основной программе) использую один и тот же кусок выделенной памяти. Так что, когда я освобождаю память из-под переменной
p в DLL, то так же освобождаю и остальные 2 переменные
Другими словами, FreeMem использовать надо было только 1 раз.