http://forum.oberoncore.ru/viewtopic.php?f=1&p=43647:
AVC писал(а):
Пример из документации ББ ("Platform-Specific Issues (Windows)").
Код:
MODULE MyInterface ["MyDll"];
PROCEDURE Proc1*; (* Proc1 èç MyDll *)
PROCEDURE Proc2* ["BlaBla"]; (* BlaBla èç MyDll *)
PROCEDURE Proc3* ["OtherDll", ""]; (* Proc3 èç OtherDll *)
PROCEDURE Proc4* ["OtherDll", "DoIt"]; (* DoIt èç OtherDll *)
END MyInterface.
Это одно из возможных решений задачи использования DLL в программах на КП, которое использовано в Блэкбокс.
На мой взгляд это решение несёт в себе очевидный недостаток: необходимость написания интерфейсных модулей для каждой библиотеки, которую мы хотим использовать.
А что если рассмотреть другое решение (пока теоретически).
Цель интерфейсных модулей: привести Си-шные типы в соответствии с КП-шными. Но "если гора не идёт к Магомеду ..." Что нам мешает ввести ещё один псевдомодуль, который будет "понимать" Си-шные типы. Разумеется использование этого модуля будет ограничено: только там, где требуются вызовы из DLL. По идеологии Блэкбокс такие вызовы - это весьма специфическое действо. По идее они должны встречаться только в подсистемах Host, Dev и в модуле Kernel.
И то, и другое решение требует соответствующей поддержки со стороны компилятора. Но во втором случае, не требуется писать километры интерфейсных модулей, которые к тому же не блещут алгоритмическими изысками
.
Можно ещё рассмотреть и третье решение: создать утилиту, которая будет автоматически генерить интерфейсные модули по входному DLL-файлу.
Всё сказанное выше - не более, чем мысли вслух. Прошу не судить строго. Возможно, я что-то упускаю из виду.