Здравствуйте, Сергей Губанов, Вы писали:
СГ>То есть ты признаешь, что сделать это без процедурных переменных невозможно....
Мне кажется, просто НЕОБХОДИМО уйти от понятия "процедурная переменная".
Есть такая вещь, как косвенный вызов.
И есть разные способы, как это сделать. В том числе — не прибегая к указателям на функции, делегатам и интерфейсам.
Применительно к связке EXE+DLL.
Очень просто:
1) заводим в EXE служебный поток — интерпретатор команд
2) передаём в DLL некую рукоятку к этому потоку (указатель на разделяемую очередь данных, семафоры и мутекс)
3) DLL, когда соблаговолит, пишет в эту очередь, отдаёт семафор "послано" и берёт семафор "готово".
4) EXE, в служебном потоке, в цикле: берёт семафор "послано", читает из очереди, интерпретирует команду (с помощью switch, например), пишет ответ, отдаёт семафор "готово"
5) DLL получает семафор "готово" и читает ответ.
Вот и всё. Где здесь указатели на функции?
Ты скажешь — как насчёт запуска потока, с указанием адреса функции. А я отвечу — это всего лишь особенность конкретного рантайма. Если бы мы играли под юниксом, то создать рабочий поток можно было бы с помощью функции fork().
А если бы многопоточность была встроена в язык, то и fork не потребовался бы.