В продвинутом варианте использования 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-х функций. Т.е. фактически явно предоставляется вся информация, вместо того, чтобы упаковать её непосредственно в библиотеку. С чего бы это?