OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 21:41

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 04 Ноябрь, 2007 05:02 

Зарегистрирован: Вторник, 03 Октябрь, 2006 21:47
Сообщения: 8
Встал такой вопрос - при создании 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 в принципе невозможно?

Конкретно, всё это нужно, чтобы использовать внешние библиотеки, в которых в самом начале могут определяться всевозможные константы и их нужно получить с теми значениями, с которыми они в определены (и, соот-но, переопределены создателем библиотеки в другой версии).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 04 Ноябрь, 2007 14:02 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
[quote="GrushinAlex"]Встал такой вопрос - при создании dll (неважно в каком языке) я могу экспортировать процедуры. ...

Может быть полезно скачать подсистему EPSE21 с http://www.inr.ac.ru/~blackbox или zinnamturm.eu (?). Там есть кое-что насчет dll для вычислителей.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 04 Ноябрь, 2007 16:56 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 04 Ноябрь, 2007 17:10 

Зарегистрирован: Вторник, 03 Октябрь, 2006 21:47
Сообщения: 8
Ага! Вот такое телодвижение помогло:
Код:
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

Работает, но как-то всё это криво выглядит.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB