Аналог "from module import something" в delphi

Рейтинг: 1Ответов: 1Опубликовано: 20.03.2011

В я например пишу

from random import randint  

Есть ли аналог этого в ?

Ответы

▲ 5

Есть, конечно. Отдельные модули представлены в виде DLL или иных PE-файлов. Возможны два основных способа подгрузки - статический и динамический.

Статический:

interface
...
function Nya(Arg1: Integer): Integer; stdcall; // соглашение вызова может быть и иным 
...
implementation
...
function Nya; external 'Nya.dll';

После чего функцию Nya можно использовать везде, где данный .pas файл есть в секции uses. Функция запишется в секцию импорта exe и при отсутствии библиотеки программа просто не запустится.

Динамический:

Необходимо объявить тип для функции - чтобы компилятор знал, какие аргументы она принимает и что возвращает. После чего подгрузить перед использованием библиотеку, найти функцию в ней, получить её адрес и использовать:

type
...
TNya = function(Arg1: Integer): Integer; stdcall;
...
implementation
...
function TestNya()
var
 hDLL: THandle;
 Nya: TNya;

begin
   // Попытка загрузки библиотеки
   hDLL := LoadLibrary('Nya.dll');
   // Если библиотека загрузилась
   if (hDLL <> 0) then
      // Попытка найти функцию в библиотеке и получить адрес
      @Nya := GetProcAddress(hDLL, 'Nya');
      // Функция имеется
      if(@Nya <> Nil)
         // Использование
         ShowMessage(IntToStr(Nya(123));
      end;
      // Выгрузка библиотеки - она больше не нужна
      FreeLibrary(hDLL);
   end;
end;

Таким образом можно сделать систему плагинов, например. Когда названия библиотек заранее неизвестны.