Возможно, я неправильно это понимаю, но кажется, что вы хотите, чтобы одна и та же копия DLL загружалась одновременно и программой C, и программой Delphi. Вы не можете сделать это и можете действительно достичь этого, используя большую работу, включающую межпроцессное взаимодействие. Приложения будут иметь отдельное пространство процесса и память.
Я бы предложил немного другой подход. В DLL есть функция с именем SendStringFromCApp и функция с именем GetStringIntoDelphiApp (или что-то подходящее).
Программа на C загрузит копию DLL как обычно и вызовет функцию SendStringFromCApp. Эта функция будет хранить переданные данные в некотором общем промежуточном формате (например, в простой базе данных). Он будет рассматривать хранилище как своего рода очередь и просто добавлять данные в эту очередь. База данных является наиболее очевидным выбором, но она может быть такой же простой, как и общий каталог, и данные хранятся в виде небольших текстовых файлов с возрастающим целым числом в качестве имени файла.
Программа Delphi загрузит свою собственную копию DLL и вызовет GetStringIntoDelphiApp, которая будет считывать первый элемент из очереди / внутреннего хранилища, обрабатывать его по мере необходимости и удалять из хранилища. Затем будет прочитано следующее и т. Д. И т. Д.
Преимущество этого заключается в том, что приложения C и Delphi могут работать независимо друг от друга. Только DLL нужна общая конфигурация, и программа на C может продолжать работать, даже если приложение Delphi не запущено, и наоборот.
По сути, это система массового обслуживания производителей и потребителей для отдельных процессов.
Как я уже сказал, возможно, я неправильно понял требования!