OberonCore https://forum.oberoncore.ru/ |
|
Экспорт/импорт глобальных переменных/констант в DLL https://forum.oberoncore.ru/viewtopic.php?f=2&t=720 |
Страница 1 из 1 |
Автор: | GrushinAlex [ Воскресенье, 04 Ноябрь, 2007 05:02 ] |
Заголовок сообщения: | Экспорт/импорт глобальных переменных/констант в DLL |
Встал такой вопрос - при создании dll (неважно в каком языке) я могу экспортировать процедуры. А глобальные переменные или константы, объявленные в модуле? Например: Код: MODULE MyDll; CONST Pi* = 3.14; VAR global* : REAL; PROCEDURE Assign*; BEGIN global := Pi; RETURN; END Assign; END MyDll. (!)DevLinker.LinkDll MyDll.dll := MyDll# ~ В созданной dll я вижу (Dependency Walker'ом) global и Assign. Исчез Pi. При этом global я всё равно не могу использовать: Код: MODULE MyDllInt ["MyDll.dll"]; VAR global* : REAL; PROCEDURE Assign*; END MyDllInt. Попытка, скажем, выдать в лог значение global из приведёного выше интерфейсного модуля приводит к сообщению: Цитата: command error: object MyDll.dll.global not found (imported from MyDllTest) Процедура Assign при этом вызывается нормально (в смысле ошибки не вызывает). Я что-то делаю не так или передавать константы/глобальные переменные из dll в принципе невозможно? Конкретно, всё это нужно, чтобы использовать внешние библиотеки, в которых в самом начале могут определяться всевозможные константы и их нужно получить с теми значениями, с которыми они в определены (и, соот-но, переопределены создателем библиотеки в другой версии). |
Автор: | Info21 [ Воскресенье, 04 Ноябрь, 2007 14:02 ] |
Заголовок сообщения: | Re: Возможен ли экспорт/импорт глобальных переменных/констант в |
[quote="GrushinAlex"]Встал такой вопрос - при создании dll (неважно в каком языке) я могу экспортировать процедуры. ... Может быть полезно скачать подсистему EPSE21 с http://www.inr.ac.ru/~blackbox или zinnamturm.eu (?). Там есть кое-что насчет dll для вычислителей. |
Автор: | GrushinAlex [ Воскресенье, 04 Ноябрь, 2007 16:56 ] |
Заголовок сообщения: | Re: Возможен ли экспорт/импорт глобальных переменных/констант в |
В продвинутом варианте использования dll (The dynamic loading of DLLs) есть что-то похожее на способ загрузки dll, которым пользуюсь в Фортране (в нём, кстати, удалось достать глобальную переменную global из примера выше). Но в данном случае не помогло, хотя код вполне идентичен фортрановскому: Код: MODULE MyDllDyn0; IMPORT SYSTEM, WinApi, Log := StdLog; TYPE ProcType = PROCEDURE (); PROCEDURE Do*; VAR dll: WinApi.HINSTANCE; MyProc: ProcType; res: INTEGER; global : REAL; BEGIN (* loading the DLL: *) dll := WinApi.LoadLibrary( "MyDll.dll" ); ASSERT( dll # 0, 100 ); (* getting access to the needed function: *) MyProc := SYSTEM.VAL( ProcType, WinApi.GetProcAddress( dll, "Assign" ) ); global := SYSTEM.VAL( REAL, WinApi.GetProcAddress( dll, "global" ) ); (* working with the function: *) Log.Ln(); Log.Real( global ); Log.Ln(); MyProc(); Log.Real( global ); Log.Ln(); (* unloading the DLL: *) res := WinApi.FreeLibrary( dll ) END Do; END MyDllDyn0. В таком варианте компилятор ругается на REAL в вызове SYSTEM.VAL - "illegal value of parameter". Если вместо REAL поставить INTEGER, компиляция проходит успешно, но есст-но ничего путного при исполнении не получается. Что нужно подавать в качестве первого параметра в процедуру SYSTEM.VAL? А константы-то так и исчезают из dll ![]() Кстати, в других языках пользуются файлами "*.h" от создателей библиотек - скажем mpif.h содержит определение полного набора всех констант со значениями, необходимых для вызова MPI-х функций. Т.е. фактически явно предоставляется вся информация, вместо того, чтобы упаковать её непосредственно в библиотеку. С чего бы это? |
Автор: | GrushinAlex [ Воскресенье, 04 Ноябрь, 2007 17:10 ] |
Заголовок сообщения: | Re: Возможен ли экспорт/импорт глобальных переменных/констант в |
Ага! Вот такое телодвижение помогло: Код: MODULE MyDllDyn0; IMPORT SYSTEM, WinApi, Log := StdLog; TYPE ProcType = PROCEDURE (); GlobType = POINTER TO ARRAY [untagged] 1 OF REAL; PROCEDURE Do*; VAR dll: WinApi.HINSTANCE; MyProc: ProcType; res: INTEGER; global : GlobType; BEGIN (* loading the DLL: *) dll := WinApi.LoadLibrary( "MyDll.dll" ); ASSERT( dll # 0, 100 ); (* getting access to the needed function: *) MyProc := SYSTEM.VAL( ProcType, WinApi.GetProcAddress( dll, "Assign" ) ); global := SYSTEM.VAL( GlobType, WinApi.GetProcAddress( dll, "global" ) ); (* working with the function: *) Log.Ln(); Log.Real( global[0] ); Log.Ln(); MyProc(); Log.Real( global[0] ); Log.Ln(); (* unloading the DLL: *) res := WinApi.FreeLibrary( dll ) END Do; END MyDllDyn0. (!)MyDllDyn0.Do Работает, но как-то всё это криво выглядит. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |