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