Как найти библиотеки в delphi

I have a couple precompiled (3rd party) libraries that I need to use in my project.

I can get it to build if I put foo.a in the root of my project folder, however, I have a 32 bit version and a 64 bit version of the library and I don’t want to have to swap out foo.a with foo.32.a and foo.64.a every time I build each version of the application.

In this particular case I’ve put them in:

[myroot]iOSDevice32Debugfoo.a
[myroot]iOSDevice32Releasefoo.a

and

[myroot]iOSDevice64Debugfoo.a
[myroot]iOSDevice64Releasefoo.a

I could put it in the libary path (Tools -> Options -> Delphi Options -> Library -> Library Path); however, I want it to be specific to the project and relative to the root of the project folder (rather than hard coded to one location for all projects).

How can I tell Delphi/Embarcadero RAD Studio where to find these libraries?

 

Для работы компонентов понадобится

JEDI API Library & Security Code Library

Набор библиотек JEDI API распаковываем в папку (путь указываю для примера, каждый может распаковывать туда куда душе будет угодно, главное что-бы путь в Environment Variables был прописан правильно):

C:DelphiJEDI

Набор моих библиотек распаковываем в папку (про расположение папки см. выше):

C:DelphiKandiral

  • 1.  Запускаем Delphi
  • 2.  Заходим в меню «Component»->»Install Packages…». Если в списке есть уже установленные ранее компоненты(старая версия), удаляем их.
  • 3.  Заходим в меню «Tools»->»Options…»->»Environment Variables». Добавляем переменные(если их нет, а если есть, то проверяем правильность пути) JEDI=C:DelphiJEDI и переменную KANDIRAL=C:DelphiKandiral
  • 4.  Заходим в меню «Tools»->»Options…»->»Library». В «Selected Platform» выбираем «32-bit Windows». В «Library path» добавляем следующие пути(если их там нет)
    • $(JEDI)jwabranches2.3Common
    • $(JEDI)jwabranches2.3Includes
    • $(JEDI)jwabranches2.3SaCMAPI
    • $(JEDI)jwabranches2.3Win32API
    • $(KANDIRAL)Release$(ProductVersion)$(Platform)
    • $(KANDIRAL)Resources
    • $(KANDIRAL)dfm

    в «Browsing path» добавляем такие пути

    • $(KANDIRAL)Automation
    • $(KANDIRAL)Common
    • $(KANDIRAL)Crypting
    • $(KANDIRAL)File
    • $(KANDIRAL)Graphics
    • $(KANDIRAL)ISO
    • $(KANDIRAL)Media
    • $(KANDIRAL)Net
    • $(KANDIRAL)Utils
    • $(KANDIRAL)Web
    • $(KANDIRAL)Windows
  • 5.  Открываем одну из групп проектов, которая соответствует вашей версии Delphi. Имя файла группы проектов имеет следующий вид Kandiral150.groupproj. Где 150 — это Package Version (подробнее см. тут Compiler Versions).
    • Kandiral150.groupproj Delphi XE
    • Kandiral160.groupproj Delphi XE2
    • Kandiral170.groupproj Delphi XE3
    • Kandiral180.groupproj Delphi XE4
    • Kandiral190.groupproj Delphi XE5
    • Kandiral200.groupproj Delphi XE6
    • Kandiral210.groupproj Delphi XE7
    • Kandiral220.groupproj Delphi XE8
    • Kandiral230.groupproj Delphi 10 Seattle
    • Kandiral240.groupproj Delphi 10.1 Berlin
    • Kandiral250.groupproj Delphi 10.2 Tokyo
    • Kandiral260.groupproj Delphi 10.3 Rio

    если в списке нет необходимого вам файла, то берем версии ниже. То есть если например у вас «Delphi 10 Seattle», а файла Kandiral230.groupproj нет, то открываем файл Kandiral220.groupproj или ниже версии, который есть.

  • 6.  В Project Manager на названии группы жмем правой кнопкой мыши и в контекстном меню выбираем «Build All»
  • 7.  После компиляции поочередно на каждом пакете жмем правой кнопкой мыши и в контекстном меню выбираем «Install»

Если всё сделано правильно, то в палитре компонентов должны появиться установленные элементы.


Library path:

$(KANDIRAL)Release$(ProductVersion)$(Platform);$(KANDIRAL)Resources;$(KANDIRAL)dfm;$(JEDI)jwabranches2.3Common;$(JEDI)jwabranches2.3Includes;$(JEDI)jwabranches2.3SaCMAPI;$(JEDI)jwabranches2.3Win32API

Browsing path:

$(KANDIRAL)Automation;$(KANDIRAL)Common;$(KANDIRAL)Crypting;$(KANDIRAL)File;$(KANDIRAL)Graphics;$(KANDIRAL)ISO;$(KANDIRAL)Media;$(KANDIRAL)Net;$(KANDIRAL)Utils;$(KANDIRAL)Web;$(KANDIRAL)Windows


При установке путей к библиотекам нужно указать платформу «32-bit Windows»

В некоторых версиях компилятор ругается на файл с картинками

Мне, во всех случаях возникновения этой ошибки, помог перезапуск Delphi.

Если перезапуск Delphi не помогает, то идём следующим путем

Первый способ. Убираем из пакета файл с картинками. На работу библиотек это не повлияет, просто сами компоненты будут без картинок. Для этого в «Project Manager» на названии пакета (например KRCommon160) жмём правой кнопкой мыши и в контекстном меню выбираем «View Source»

Удаляем строчку

{$R ‘….CommonKRCommon.dcr’}

и перекомпилируем пакет.

Второй способ. Подключаем картинки старого формата. В каждом пакете есть файл типа «ИмяПакета.dcr», в нем содержатся картинки всех компонентов (которые я уже нарисовал). Но есть и еще dcr файлы, которые сделаны в imageedit от Delphi 7. Второй способ заключается в том, что-бы заменить новый файл с картинками на старые. Для этого в «Project Manager» на названии пакета (например KRCommon160) жмём правой кнопкой мыши и в контекстном меню выбираем «View Source»

И вместо файла KRCommon.dcr подключаем все остальные dcr файлы из папки Common

Перекомпилируем пакет. Аналогично проделываем с остальными пакетами где вылетает ошибка.

BDE: Traditionally, the main BDE DLL, Idapi32.Dll was installed to

C:Program Files (x86)Common FilesBorland SharedBDE

by the default Delphi install. I have not installed the BDE onto a recent (Win7/Win10) version of Windows, but would not be surprised if the DLL ended up in SysWOW64.

ADO: You need to look in the Delphi source file ADOInt.Pas to identify the name of the ADO DLL your Delphi version uses. It will be at the top of the file in a section that looks like this (following is for D7, because I don’t have D5 installed):

unit ADOInt;

// ********************************************************************* //
// Type Lib: C:PROGRAM FILESCOMMON FILESSYSTEMADOMSADO15.DLL        //
// IIDLCID: {00000200-0000-0010-8000-00AA006D2EA4}                    //
// PASTLWTR : 1.1                                        //
// HelpString: Microsoft ActiveX Data Objects 2.1 Library                //
// Version:    2.1                                                       //
// ********************************************************************* //

Btw, you need the 32-bit version of MSADO15.DLL, which on my (Win10 64-bit) system is located in

C:Program Files (x86)Common FilesSystemado

The Delphi source files you need to study to see how Delphi uses thd BDE and ADO are

DBTables.Pas, BDE.Int and SMIntf.Pas for the BDE and ADOInt.Pas and ADODB.Pas for ADO.

As you will see, in the BDE code, there is no exact counterpart to a TAdoConnection, which is why I told you in reply to your other q that you are wasting your time trying to ease conversion by coming up with a connection type which could be used for both. Sorry to say so, but the fact that you’ve had to ask this q is a pretty good sign that you are out of your depth trying to come up with a «mixed connection» solution.

Рассмотреть как все это происходит, я предлагаю на сквозном примере, сложения двух чисел, где собственно процедура самого сложения будет находиться в файле dll.

Итак приступим:

  • Запускаем Delphi и создаем новый проект;
  • Размещаем на форме 3 компонента Edit, 2 компонента Label, 1 компонент Button, и настраиваем примерно как представлено, затем компилируем и сохраняем;

dll-delphi-дельфи-1.jpg Динамические подключаемые библиотеки dll в Delphi

  • Далее заходим в пункт меню File -> New -> Other -> Dynamic-linc Library, жмем Ок и сохраняем все в папке с нашим проектом, только изменяем имя сохраняемого на Project2.
  • В открывшемся листинге, текст между разделами library Project2 и uses, можно удалить, после значения {$R *.res}, создаем нашу функцию сложения и описываем ее:

Function summ(a,b:Integer):Integer; StdCall;

//Называем ее именем summ, тип переменных Integer, выходной параметр тоже Integer,

//StdCall — говорит о стандартном способе вызова, то-есть о совместимости с Windows API,

//если его не указать то сторонние  разработчики ПО будут испытывать сложности

//с подключением к нашей библиотеке, если мы не планируем, чтобы кроме нас библиотеку

//кто то использовал еще, то можно его и не указывать, но мы укажем 

begin

result:=a+b; //Ну а тут пишем, что наша функция должна выполнять; 

end;

  • После того как мы описали нашу функцию, под оператором end; пишем:

exports summ;

//Здесь ключевое слово expotrs, позволяет экспортировать нашу функцию summ,

//чтобы ее можно было использовать извне, то-есть из любых программ

Код нашей DLL:

dll-delphi-дельфи-2.jpg Динамические подключаемые библиотеки dll в Delphi

  • Компилируем нашу библиотеку, соглашаемся с сообщением, что компилируем ее без параметров, закрываем наш Project2 и открываем Project1.dproj, а на вопрос о сохранении изменений в Project2.dproj, жмем Ok

Еще маленький нюанс…

  • Заходим в папку с нашим проектом, у нас такой путь:

  • C:UsersUserDocumentsRAD StudioProjects.dll в DelphiWin32DebugWin32Debug

  • и копируем от туда скомпилированную библиотеку — Project2.dll  в общую папку с проектом, у нас такой путь: 

  • C:UsersUserDocumentsRAD StudioProjects.dll в Delphi  …чтобы наша программа смогла ее найти!!!

  • Далее прописываем в наш открывшийся проект созданную нами функцию, для этого после значения {$R *.res} раздела implementation , пишем:

Function summ(a,b:Integer):Integer; StdCall; External ‘Project2.dll’;

//Здесь External ‘Project2.dll’ говорит о том, что описание функции мы берем извне, то-есть из созданного нами .dll файла

  • Создаем обработчик событий OnClick на нашей кнопке, где прописываем следующее:

var

c:Integer; //Здесь с — промежуточная переменная, куда будет помещаться результат работы нашей функции;

begin

c:=(Summ(StrToInt(Edit1.Text),StrToInt(Edit2.Text)));

//Тут, мы в качестве первого параметра функции указываем содержимое Edit1, а второго — 

//Edit2, и помещаем результат в переменную с 

Edit3.Text:=IntToStr(c); //Выводим результат в  Edit3;

end;

  • Запускаем проект, вводим значения в первые два эдита, жмем — «Посчитать» и если вы все выполняли внимательно, то в Edit3, отобразится сумма введенных нами чисел.

Delphi — Работа с DLL библиотеками

DLL  — Dynamic Link Library иначе динамически подключаемая библиотека, которая позволяет многократно применять одни и те же функции в разных программах. На самом деле довольно удобное средство, тем более что однажды написанная библиотека может использоваться во многих программах. В сегодняшнем уроке мы научимся работать с dll и конечно же создавать их!
Ну что ж начнём!

Для начала создадим нашу первую Dynamic Link Library! Отправляемся в Delphi и сразу же лезем в меню File -> New ->Other.
Перед нами появляется вот такое окошко:

Delphi dll библиотека

Выбираем в списке Dynamic-Link Library (в версиях младше 2009 Delphi пункт называется DLL Wizard).

dll delphi библиотека

В результате у нас появляется лишь окно с кодом, заметьте никакой формы у нас здесь нет !
Теперь начинается самое интересное. Напишем наши первые процедуры в библиотеке.

library Project2;
//Вы, наверное уже заметили, что вместо program 
//при создании dll используется слово library.
//Означающее библиотека.
uses
SysUtils, dialogs,
Classes; // Внимание ! Не забудьте указать эти модули,
// иначе код работать не будет

{$R *.res}
{В ЭТУ ЧАСТЬ ПОМЕЩАЕТСЯ КОД DLL}

Procedure FirstCall; stdcall; export;
//Stdcall – При этом операторе параметры помещаются в стек
//справа налево, и выравниваются на стандартное значение
//Экспорт в принципе можно опустить, используется для уточнения
//экспорта процедуры или функции.

Begin
ShowMessage(‘Моя первая процедура в dll‘);
//Вызываем сообщение на экран
End;

Procedure DoubleCall; stdcall; export;
Begin
ShowMessage(‘Моя вторая процедура‘);
//Вызываем сообщение на экран
End;

Exports FirstCall, DoubleCall;
//В Exports содержится список экспортируемых элементов.
//Которые в дальнейшем будут импортироваться какой-нибудь программой.

begin
End.

На этом мы пока остановимся т.к. для простого примера этого будет вполне достаточно. Сейчас сохраняем наш проект, лично я сохранил его под именем Project2.dll и нажимаем комбинацию клавиш CTRL+F9 для компиляции библиотеки. В папке, куда вы сохранили dpr файл обязан появится файл с расширением dll, эта и есть наша только что созданная библиотека. У меня она называется Project2.dll

Займёмся теперь вызовом процедур из данной библиотеки. Создаём по стандартной схеме новое приложение. Перед нами ничего необычного просто форма. Сохраняем новое приложение в какую-нибудь папку. И в эту же папку копируем только что созданную dll библиотеку. Т.е. в данном примере Project2.dll

Теперь вам предстоит выбирать, каким способом вызывать функции из библиотеки. Всего существует два метода вызова.

Способ № 1
Пожалуй, это самый простой метод вызова процедур находящихся в библиотеке.
Идеально подходит для работы только с одной библиотекой.

Ну что поехали…
После ключевого слова implementation прописываем следующий код:

Procedure FirstCall; stdcall; external ‘Project2.dll’;
// Вместо Project2.dll может быть любое имя библиотеки

Procedure DoubleCall; stdcall; external ‘Project2.dll’;

Здесь, как вы уже наверное догадались, мы сообщаем программе названия наших процедур и говорим, что они находятся в dll библиотеке, в моем случае с именем Project2.dll

Теперь для того, что бы вызвать данные процедуры нам необходимо лишь вставить их названия в любое место кода, что мы сейчас и сделаем. Кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick

OnClick первой кнопки:

Procedure TForm1.Button1Click(Sender: TObject);
Begin
FirstCall; // Имя процедуры, которая находится в dll
End;

OnClick второй кнопки:

Procedure TForm1.Button2Click(Sender: TObject);
Begin
DoubleCall; // Имя процедуры, которая находится в dll
End;

Вот и все !

Способ № 2:
Сложнее чем первый, но у него есть свои плюсы, а самое главное, что он идеально подходит для плагинов.
Для применения данного метода, первым делом объявляем несколько глобальных переменных:

Var
LibHandle: HModule; //Ссылка на модуль библиотеки
FirstCall: procedure; stdcall;
//Имена наших процедур лежащих в библиотеке.

DoubleCall: procedure; stdcall;

Затем после ключевого слова implementation напишем процедуру которая будет загружать нашу библиотеку:

Procedure LoadMyLibrary(FileName: String);
Begin
LibHandle:= LoadLibrary(PWideChar(FileName));
//Загружаем библиотеку!
// Внимание ! PChar для версий ниже 2009 Delphi
If LibHandle = 0 then begin
MessageBox(0,’Невозможно загрузить библиотеку‘,0,0);
Exit;
End;

FirstCall:= GetProcAddress(LibHandle,’FirstCall‘);
//Получаем указатель на объект
//1-ий параметр ссылка на модуль библиотеки
//2-ой параметр имя объекта в dll

DoubleCall:= GetProcAddress(LibHandle,’DoubleCall‘);
If @FirstCall = nil then begin
//Проверяем на наличие этой функции в библиотеке.
MessageBox(0,’Невозможно загрузить библиотеку‘,0,0);
Exit;
End;
If
@DoubleCall = nil then begin
//Проверяем на наличие этой функции в библиотеке.
MessageBox(0,’Невозможно загрузить библиотеку‘,0,0);
Exit;
End; End;

После чего на форме создаем, обработчик событий OnCreate, в котором с помощью только что созданной процедуры мы загрузим нашу библиотеку

Procedure TForm1.FormCreate(Sender: TObject);
Begin
LoadMyLibrary(‘Project2.dll‘);
End;

Теперь опять же, для того, что бы вызвать необходимые процедуры из нашей библиотеки нам необходимо лишь вставить их названия в любое место кода. Для этого кидаем на форму 2 компонента Button с закладки Standart и создаем на каждой обработчик событий OnClick

OnClick первой кнопки:

Procedure TForm1.Button1Click(Sender: TObject);
Begin
FirstCall; // Имя процедуры, которая находится в dll
End;

OnClick второй кнопки:

Procedure TForm1.Button2Click(Sender: TObject);
Begin
DoubleCall; // Имя процедуры, которая находится в dll
End;

Ну и напоследок создаем обработчик событий OnDestroy на форме, в котором выгружаем dll библиотеку из памяти

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
FreeLibrary(LibHandle);
//Выгружаем библиотеку из памяти.
End;

Вот и все ! Второй способ получился довольно громоздкий, но его плюс в уточнении хранящегося объекта в библиотеке.

Скачать исходник (dll библиотека + 1 способ + 2 способ )

P.S. Хотите вперед всех остальных посетителей сайта получать свежие Видео уроки, Аудио подкасты, статьи по Delphi.
Участвовать в конкурсах и постепенно вливаться в нашу команду ?!
Тогда прямо сейчас подписывайтесь на бесплатную мультимедийную рассылку сайта delphiexpert.ru
Нас уже больше чем 3500 человек ! Подписаться

Похожие материалы

  • Delphi & Bass. Эффект затухания звука
  • Delphi уроки — Drag&Drop, перетаскивание строк в компоненте DBGrid
  • Delphi урок — Невидимая форма с видимыми компонентами
  • Видео урок — Delphi и MySql, подключение
  • Delphi изменяем миниатюру программы в Windows 7

Последние из рубрики

  • Видео урок — Delphi простейшая работа с PDF документацией (часть 2)
  • Delphi & Bass. Эффект затухания звука
  • Delphi изменяем миниатюру программы в Windows 7

Понравилась статья? Поделить с друзьями:
  • Как найти промокоды фри фаер
  • Как найти мерседес бенц
  • Нам известны 2 катета как найти гипотенузу
  • Как найти человека по мобильному на карте
  • Прожженный диван как исправить