OberonCore https://forum.oberoncore.ru/ |
|
Поддержка DLL в программах на КП https://forum.oberoncore.ru/viewtopic.php?f=1&t=2405 |
Страница 1 из 1 |
Автор: | igor [ Понедельник, 01 Март, 2010 09:08 ] |
Заголовок сообщения: | Поддержка DLL в программах на КП |
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-файлу. Всё сказанное выше - не более, чем мысли вслух. Прошу не судить строго. Возможно, я что-то упускаю из виду. |
Автор: | AVC [ Понедельник, 01 Март, 2010 09:25 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
igor писал(а): Можно ещё рассмотреть и третье решение: создать утилиту, которая будет автоматически генерить интерфейсные модули по входному DLL-файлу. IMHO, это был бы хороший вариант, если бы "технология" DLL дотягивала до уровня оберонов (раздельная компиляция, символьные файлы, межмодульный контроль соответствия). Но этого нет, поэтому имеет смысл рассмотреть генерацию интерфейсного модуля по файлам сишных заголовков (что поможет только частично). Кажется, у XDS были какие-то наработки в этой области (если Александр Ильин это подтвердит). |
Автор: | Евгений Темиргалеев [ Понедельник, 01 Март, 2010 09:43 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
AVC писал(а): Но этого нет, поэтому имеет смысл рассмотреть генерацию интерфейсного модуля по файлам сишных заголовков (что поможет только частично). Угу. Учитывая практики вида Код: #define StdFunc1(a) Do(1, a, 0) Требуется не только интерфейсный модуль к бинарной библ. и модуль-прослойка=интерфейс к стандарту библиотеки #define StdFunc2(a, b) Do(2, a, b) void Do (int fn, int a, int b); Код: бинарник <- интерфейс КП <- модуль-прослойка <- КП Тут, по-моему, может быть только управляемая/контролируемая автогенерация...
|
Автор: | Александр Ильин [ Понедельник, 01 Март, 2010 09:49 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
AVC писал(а): Но этого нет, поэтому имеет смысл рассмотреть генерацию интерфейсного модуля по файлам сишных заголовков (что поможет только частично). Кажется, у XDS были какие-то наработки в этой области (если Александр Ильин это подтвердит). У XDS есть улитита H2D, которая конвертирует .h в .def: Код: DEFINITION MODULE ["StdCall"] ModuleName; Это уже получится довольно близко к Оберону/КП. Насчёт обработки макросов точно сказать не могу, но не удивлюсь, если и это работает.... далее на Modula-2 Если из DLL брать интерфейс, то там будут только имена функций, а с какими параметрами их вызывать - нет информации. |
Автор: | igor [ Понедельник, 01 Март, 2010 10:22 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
Александр Ильин писал(а): Если из DLL брать интерфейс, то там будут только имена функций, а с какими параметрами их вызывать - нет информации. Эта мысль на уровне подсознания сверлила мне голову ![]() ![]() Но, наши никогда не сдаются! ![]() В мире Windows+Си все же пользуются библиотеками DLL. У меня тут вопрос к знатокам Си и DLL. Как в программах на Си решается эта проблема: списки параметров DLL-функций предварительно специфицируются в специальных заголовочных файлах, или передача правильных фактических параметров целиком лежит на совести программиста клиентской программы? |
Автор: | AVC [ Понедельник, 01 Март, 2010 10:34 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
igor писал(а): Как в программах на Си решается эта проблема: списки параметров DLL-функций предварительно специфицируются в специальных заголовочных файлах, или передача правильных фактических параметров целиком лежит на совести программиста клиентской программы? Да, специфицируются в специальных заголовочных файлах. |
Автор: | igor [ Понедельник, 01 Март, 2010 10:53 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
AVC писал(а): Да, специфицируются в специальных заголовочных файлах. Отлично. Значит у нас есть все необходимые спецификации для написания утилиты файл_DLL+заголовочный_файл TO интерфейсный_модуль_КП. Ведь все эти заголовочные файлы, я так понимаю, доступны через соответствующие development kit. Только представьте себе, несколько запусков такой утилиты, и вся DirectX (к примеру) портирована в Блэкбокс. Правда это не избавляет от необходимости написать соответствующее расширение каркаса. ("Остапа понесло", ![]() |
Автор: | Alexey Veselovsky [ Понедельник, 01 Март, 2010 10:55 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
И тут ВНЕЗАПНО выясняется, что dll пишутся не только на Си ![]() |
Автор: | igor [ Понедельник, 01 Март, 2010 11:08 ] |
Заголовок сообщения: | Re: Поддержка DLL в программах на КП |
Alexey Veselovsky писал(а): И тут ВНЕЗАПНО выясняется, что dll пишутся не только на Си ![]() Хе! Должен признаться, что подавляющее большинство интересующих меня DLL написаны именно на C/C++ ![]() PS: Если верить документации DevLinker, то DLL можно написать и на КП. Но вряд ли кто-нибудь станет переписывать на КП какую-нибудь opengl32.dll |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |