1 способ. Привязка DLL к программе. Это наиболее простой и легкий метод для использования функций, импортируемых из DLL. Однако (и на это следует обратить внимание) этот способ имеет очень весомый недостаток - если библиотека, которую использует программа, не будет найдена, то программа просто не запустится, выдавая ошибку и сообщая о том, что ресурс DLL не найден. А поиск библиотеки будет вестись: в текущем каталоге, в каталоге программы, в каталоге WINDOWS\SYSTEM, и т.д.
Итак, для начала - общая форма этого приема:
	
	
	
		PHP:
	
	
		implementation
...
function FunctionName(Par1: Par1Type; Par2: Par2Type; ...): ReturnType; stdcall; external 'DLLNAME.DLL' name 'FunctionName' index FuncIndex;
// или (если не функция, а процедура):
procedure ProcedureName(Par1: Par1Type; Par2: Par2Type; ...); stdcall; external 'DLLNAME.DLL' name 'ProcedureName' index ProcIndex;
	 
 Здесь: FunctionName (либо ProcedureName) - имя функции (или процедуры), которое будет использоваться в Вашей программе;
Par1, Par2, ... - имена параметров функции или процедуры;
Par1Type, Par2Type, ... - типы параметров функции или процедуры (например, Integer);
ReturnType - тип возвращаемого значения (только для функции);
stdcall - директива, которая должна точно совпадать с используемой в самой DLL;
external 'DLLNAME.DLL' - директива, указывающая имя внешней DLL, из которой будет импортирована данная функция или процедура (в данном случае - DLLNAME.DLL);
name 'FunctionName' ('ProcedureName') - директива, указывающая точное имя функции в самой DLL. Это необязательная директива, которая позволяет использовать в программе функцию, имеющую название, отличное от истинного (которое она имеет в библиотеке);
index FunctionIndex (ProcedureIndex) - директива, указывающая порядковый номер функции или процедуры в DLL. Это также необязательная директива.
2 способ. Динамическая загрузка DLL. Это гораздо более сложный, но и более элегантный метод. Он лишен недостатка первого метода. Единственное, что неприятно - объем кода, необходимого для осуществления этого приема, причем сложность в том, что функция, импортируемая из DLL достуна лишь тогда, когда эта DLL загружена и находится в памяти... С примером можно ознакомиться ниже, а пока - краткое описание используемых этим методом функций WinAPI:
LoadLibrary(LibFileName: PChar) - загрузка указанной библиотеки 
LibFileName в память. При успешном завершении функция возвращает дескриптор (THandle) DLL в памяти.
GetProcAddress(Module: THandle; ProcName: PChar) - считывает адpес экспоpтиpованной библиотечной функции. При успешном завершении функция возвращает дескриптор (TFarProc) функции в загруженной DLL.
FreeLibrary(LibModule: THandle) - делает недействительным LibModule и освобождает связанную с ним память. Следует заметить, что после вызова этой процедуры функции данной библиотеки больше недоступны.
Привязка DLL к программе
1. Первый способ
	
	
	
		PHP:
	
	
		{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}
implementation
{Определяем внешнюю библиотечную функцию}
function GetSimpleText(LangRus: Boolean): PChar; stdcall; external 'MYDLL.DLL';
procedure Button1Click(Sender: TObject);
begin
  {И используем ее}
  ShowMessage(StrPas(GetSimpleText(True)));
  ShowMessage(StrPas(GetSimpleText(False)));
  {ShowMessage - показывает диалоговое окно с указанной надписью; StrPas - преобразует строку PChar в string}
end;
	 
 2. Способ
	
	
	
		PHP:
	
	
		{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1}
var
      Form1: TForm1;
      GetSimpleText: function(LangRus: Boolean): PChar;
      LibHandle: THandle;
procedure Button1Click(Sender: TObject);
begin
  {"Чистим" адрес функции от "грязи"}
  @GetSimpleText := nil;
  {Пытаемся загрузить библиотеку}
  LibHandle := LoadLibrary('MYDLL.DLL');
  {Если все OK}
  if LibHandle >= 32 then begin
    {...то пытаемся получить адрес функции в библиотеке}
    @GetSimpleText := GetProcAddress(LibHandle,'GetSimpleText');
    {Если и здесь все OK}
    if @GetSimpleText <> nil then
      {...то вызываем эту функцию и показываем результат}
      ShowMessage(StrPas(GetSimpleText(True)));
  end;
  {И не забываем освободить память и выгрузить DLL}
  FreeLibrary(LibHandle);
end;
	 
 ПРИМЕЧАНИЕ: Следует воздерживаться от использования типа string в библиотечных функциях, т.к. при его использовании существуют проблемы с "разделением памяти". Подробней об этом можно прочитать (правда, на английском) в тексте пустого проекта DLL, который создает Delphi (File -> New -> DLL). Так что лучше используйте PChar, а затем при необходимости конвертируйте его в string функцией StrPas.
Ну а теперь разберем непосредственно саму библиотеку DLL:
Пример 3. Исходник проекта MYDLL.DPR
	
	
	
		PHP:
	
	
		library mydll;
uses SysUtils, Classes;
{Определяем функцию как stdcall}
function GetSimpleText(LangRus: Boolean): PChar; stdcall;
begin
  {В зависимости от LangRus возвращаем русскую (True) либо английскую (False) фразу}
  if LangRus then
    Result := PChar('Здравствуй, мир!')
  else
    Result := PChar('Hello, world!');
end;
{Директива exports указывает, какие функции будут экспортированы этой DLL}
exports GetSimpleText;
begin
end.
	 
 Пример 4. Размещение формы в DLL 
	
	
	
		PHP:
	
	
		function ShowMyDialog(Msg: PChar): Boolean; stdcall;
...
exports ShowMyDialog;
function ShowMyDialog(Msg: PChar): Boolean;
begin
  {Создаем экземпляр Form1 формы TForm1}
  Form1 := TForm1.Create(Application);
  {В Label1 выводим Msg}
  Form1.Label1.Caption := StrPas(Msg);
  {Возвращаем True только если нажата OK (ModalResult = mrOk)}
  Result := (Form1.ShowModal = mrOk);
  {Освобождаем память}
  Form1.Free;
end;
	 
 
Если же нужно разместить в DLL немодальную форму, то необходимо сделать две функции - открытия и закрытия формы. При этом нужно заставить DLL запомнить дескриптор этой формы.