Как сделать dll файл
Перейти к содержимому

Как сделать dll файл

  • автор:

Статья Как создать dll библиотеку?

Очень часто в своей работе, Вы будете сталкиваться с такой ситуацией.

Перед вами стоит задача, нужно написать программу » Супер Блокнот» которая должна сохранить все функции стандартного блокнота, но при этом иметь ряд каких-то дополнительных функций, благодаря которым, при выборе программы для работы с текстом, пользователь будет отдавать предпочтение именно вашей программе. Для этого было решено добавить несколько новых функций, одна из них, будет отвечать за подсчет и вывод количества слов в тексте.

Через пару недель программа была написана, затем она попала в Интернет, пользователи оценили новый продукт и стали им пользоваться. Цель достигнута.

Проходит время и перед вами ставят новую задачу, написать программу «Супер парсер«. Одной из функции данной программы, будет подсчет слов в тексте. Вы понимаете, что снова придется разрабатывать метод, который будет вести подсчёт слов. Но, при этом вспоминаете, что совсем не давно уже разрабатывали программу, в которой применялась данная функция. Чтобы не изобретать велосипед, Вы открываете исходник программы «Супер блокнот«; и копируете весь метод в исходник новой программы «Супер парсер«. Отлично, теперь Вам не придется тратить время на написание этого метода заново, и Вы можете посветить больше времени остальным элементам программы. Задача решена.

28409

Но, что если метод по подсчету слов, писали не Вы, а допустим, какой-нибудь коллега по работе и по каким-то причинам, Вы не можете получить доступ к исходному коду программы «Супер блокнот«. То есть первый вариант, копирование метода из исходника, не прокатит и данный метод придется писать самому ммм, печалька.

Но, тут вам звонит ваш коллега по работе и говорит: Ты знаешь, я тут вспомнил, когда я разрабатывал данный метод, я подумал, что возможно мне придется его использовать ещё где-то, и по этому я решил вынести его в отдельную сборку, в виде файла динамической библиотеки (dll).Ты просто скопируй этот файл dll в свой проект, и подключи его, как внешнюю сборку, после чего ты получишь доступ к моему методу и сможешь им пользоваться.

Отлично! Вы проделываете все описанные действия, в программе “Супер парсер” появляется нужный метод, задача решена и вам вновь не пришлось повторно писать код руками.

28410

На этом присказка закончена и теперь переходим к более подробному изучению.

Что такое DLL

DLL (dynamic-link library) — это динамически подключаемая библиотека, или сокращено динамическая библиотека.

Как уже писал ранее, динамические библиотеки, позволяют повторно использовать ранее написанный код, а так же они обеспечивают лучшую переносимость кода. Достаточно, скинуть файл на флешку, или скачать dll файл из Интернета, после чего добавить его в текущий проект и тут же получить набор разных дополнительных функций для вашего приложения. Так же стоит знать, что в одном dll файле может храниться любое количество типов, членов и пространств имён.

Создание файла dll

Для начала выберем тип нового создаваемого приложения, а точнее проекта.

Выбираем Class Library, то есть создаем файл динамической библиотеки (dll)

Так же Вы можете указать, под какую версию Фреймворка будет создаваться данный проект.

28411

После того, как Visual Studio создаст каркас проекта, Вы увидите следующее:

Так будет выглядеть окно Solution Explorer

28412

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

28413

И так дано пространство имён: Car и класс: Class1. Class1 не удачное название, давайте немного изменим наш код, заменив Class1 на BMW, и добавим метод, который будет выводить имя нашего класса.

28414

И так код написан, и теперь необходимо выполнить компиляцию, чтобы получить сборку.
Если сейчас попытаться нажать F5 или Ctrl+F5, то вы увидите данное окно

28415

A project with an Output type of Class Library cannot be started directly

Данная ошибка, говорит лишь о том, что был создан файл динамической библиотеки (dll), а не исполняемый файл (exe), который не может быть запущен.

Для того, чтобы скомпилировать проект, нажмите клавишу F6, после чего в директории bin\Debug появиться файл Car.dll.

Чтобы проверить был ли создан файл библиотеки, воспользуйтесь кнопкой Show All Files на вкладке Solution Explorer

28416

Сборка, в виде файла динамической библиотеки успешно создана.

Теперь перейдем в папку bin\Debug, для того, чтобы быстро переместиться в текущую директорию проекта, в том же Solution Explorer воспользуйтесь пунктом Open Folder in Windows Explorer

28417

Скопируйте полученный файл сборки (в нашем случае — это файл Car.dll) в какую-нибудь временную папку. На самом деле, это делать необязательно, Вы можете оставить данный файл в этой папке, но для удобства, создадим новую папку, и поместим туда созданный файл библиотеки.

После чего закроем текущий проект и создадим новый. Но, на этот раз выберем тип проекта — консольное приложение.

Создаем новый проект.

28418

Новый проект создан. Теперь подключим в текущий проект, нашу библиотеку (Car.dll)

Подключение dll

Для этого на папке References, в окне Solution Explorer нужно нажать правую кнопку мыши и выбрать пункт Add Reference, откроется вот такое окно:

28419

  1. Выберите вкладку Browse
  2. Укажите папку, в которой лежит файл созданной библиотеки (в нашем примере — Car.dll)
  3. Выделите файл нужной библиотеки и нажмите кнопку ОК;

28420

На ней видно, что в наш текущий проект была успешна, добавлена ссылка на нашу сборку Car.dll, в которой храниться наш код на языке IL. Надеюсь, Вы помните, что после компиляции весь написанный вами код преобразуется в промежуточный код на языке IL (CIL, MSIL — это одно и тоже). А так же видно, что в папку bin\Debug была помещёна копия нашей библиотеки.

28421

Если вдруг Вы забыли, какое пространство имен, типы, или члены содержит ваша созданная библиотека. Вы всегда можете воспользоваться таким инструментом Visual Studio, как Object Browser. Для этого перейдите на вкладку Solution Explorer, откройте папку References, и просто щёлкните правой кнопкой мыши по добавленной ранее библиотеке, в нашем случае напоминаю — это файл (Car.dll) и выберите пункт View in Object Browser, появиться вот такое окно.

28422

В окне Object Browser можно посмотреть содержимое нашей сборки.

Сборка подключена и теперь Вы можете работать с её содержимым. Далее выполним необязательный пункт.

Добавим, с помощью ключевого слова using пространство имен Car из созданной нами библиотеки Car.dll, после чего создадим объект класса BMW и выполним метод Вывести_Имя_Класса().

28423

28424

  1. Создаем файл динамической библиотеки (dll)
  2. Подключаем созданную библиотеку в наш проект, путем добавления в папку References ссылки на наш файл dll.
  3. (Необязательный пункт) Подключаем пространство имен из подключенной сборки, с помощью ключевого слова using, либо используем полное наименование, то есть Пространство имён.Тип (Car.BMW).
  4. Profit

И в конце не много информации о типах сборок:

Сборки бывают следующих основных видов: общие и частные.

Частная сборка (private assembly)

Это файлы библиотек, как наш ранее созданный файл Car.dll, которые содержаться на протяжении всего времени в каталоге текущего приложения или любом из его подкаталогов.

Вернёмся к началу статьи.

После того, как было создано приложение “Супер парсер”, мы получили сборку в виде файла (exe). Затем мы решили протестировать нашу программу и отдаём её нашему другу, при этом Вы так же упоминаете, что если он хочет иметь дополнительные функции в программе, то ему нужно просто рядом с его exe файлом поместить файл библиотеки Car.dll. После чего он получит возможность подсчёта слов в тексте. То есть библиотека будет храниться в той же директории, что и исполняемый файл.

28425

Общие сборки (shared assembly)

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

К примеру, у нас есть две программы. Которые будет использовать наш файл Car.dll, чтобы не копировать данный файл в каждую папку, мы можем поместить его в специальное место, которое называется Global Assembly Cache — (GAC) или глобальный кэш сборок. Теперь сборка будет храниться в одном специальном месте, и ваши программа всегда будут знать, где можно найти данную библиотеку кода. Если бы мы воспользовались приватным способом, то нам бы пришлось поместить нашу библиотеку, в каждую папку того приложения, с которым она должна взаимодействовать.

Как создать DLL-файл со значками

Вероятно вам приходилось видеть, что некоторые DLL-файлы содержат множество значков. Например, shell32.dll, imageres.dll и другие. Мы также можем создать такую библиотеку значков, которая будет храниться в DLL-файле. Также я покажу, как можно извлечь значки и вывести их на форме.

Шаг первый. Запустите Visual Studio 2010 и создайте новый проект Class Library. Для удобства я присвоил проекту имя IconLibrary.

Далее выбираем в меню File | New | File и в диалоговом окне выбираем пункт Native Resource Template и щелкаем на кнопке Open.

В результате будет создан файл ResTempl1.rct. Щелкните правой кнопкой на файле в Visual Studio и выберите команду Add Resource. .

В диалоговом окне Add Resource выберите элемент Icon и щелкните кнопку Import. . Вам необходимо указать значки, которые вы хотите импортировать. Рекомендую сложить все необходимые значки в одну папку и затем их выбрать сразу все (поддерживается множественный выбор). Когда вы щелкните кнопку Open, все значки будут импортированы под именами IDI_ICON1, IDI_ICON1 и т.д.

Снова выбираем команду Add Resource. и выбираем элемент Version и щелкаем на кнопке New. Будет создана заготовка для хранения информации о версии файла. Добавьте свою информацию о версии файла, названии продукта, торговой марке и т.д.

Далее необходимо сохранить файл ResTempl1.rct как res-файл (File | Save ResTempl1.rct as. и выберите расширение res).

Вернитесь на вкладку Class1.cs и выберите Project | IconLibrary Properties. . Установите переключатель Resource File и укажите путь к созданному ранее файлу ресурсов с расширением RES.

Далее выбираем Build | Build IconLibrary. В результате у нас образуется файл динамической библиотеки IconLibrary.dll.

Чтобы убедиться в том, что у нас появился полноценный DLL-файл со значками, выберите ярылк любого exe-файла, например, Notepad.exe и в свойствах ярлыка выберите кнопку Сменить значок. В диалоговом окне Смена значка через кнопку Обзор укажите путь к вашей библиотеке и вы увидите все значки, которые хранятся в вашем файле. Поздравляю, вы создали свою библиотеку значков.

Использование значков из DLL-файла

Существуют несколько вариантов использования DLL-файла со значками в собственных целях. Например, вы создали собственное расширение для своего приложения и в реестре можете прописать путь к вашему файлу и указать порядковый номер значка (эта тема выходит за рамки данной статьи).

Рассмотрим пример извлечения значка из Dll-файла и показа его на форме.

Создадим обычное приложение Windows Form Application и разместим на форме кнопку. Далее воспользуемся системной функцией Windows API ExtractIcon:

 using System.Runtime.InteropServices; [DllImport("shell32.dll")] static extern IntPtr ExtractIcon(IntPtr hInst, string sFileName, int nIconIndex); 

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

 private void button1_Click(object sender, EventArgs e)

Как видите, ничего сложного. Удачного вам программирования!

Delphi: DLL библиотеки

Чтобы создать новую библиотеку DLL в Delphi, выберите команду меню File > New > Other. В панели Items Categories окна New Items выберите узел Delphi Projects, после чего дважды щелкните на элементе Dynamic-link Library в правой панели окна.

Мастер DLL Wizard создает главный файл исходного кода библиотеки DLL, который выглядит практически так же, как и исходный код, сгенерированный для обычного приложения. Единственное отличие состоит в том. что этот файл начинается с зарезервированного слова library, а не program.

library Project1; < Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. > < Важное замечание относительно управления памятью библиотеки DLL: модуль ShareMem должен быть первым модулем в операторе uses вашей библиотеки и в операторе uses вашего проекта (выберите команду меню Project ->View Source (Проект -> Показать исходный код)), если ваша библиотека DLL экспортирует какие-либо процедуры или функции, передающие строки в качестве параметров или результатов выполнения функций. Это относится ко всем строкам, передаваемым или получаемым из вашей библиотеки DLL, и даже к тем строкам, которые вложены в записи и классы. Модуль ShareMem является модулем интерфейса для администратора общей памяти BORLNDMM.DLL, который вы должны развертывать вместе со своей библиотекой DLL. Чтобы не использовать BORLNDMM.DLL, передавайте строковую информацию с помощью параметров PChar или ShortString. > uses SysUtils, Classes; begin end.

Все, что вам нужно сделать сейчас — это добавить подпрограмму перед блоком begin-end, вот и все. После этого вы получите внутреннюю подпрограмму, которую можно будет использовать в библиотеке DLL, но не во внешних приложениях. Если вы хотите вызывать подпрограмму из других приложении и других библиотек DLL, ее потребуетсл экспортировать. Чтобы экспортировать подпрограмму по имени, добавьте ее в список exports. Список exports имеет такой же синтаксис, что и список uses, за исключением того, что в списке exports любой элемент является подпрограммой, а не модулем.

Список exports обычно ставится непосредственно перед блоком begin-end. Взгляните на листинг 1, в котором представлен исходный код простой библиотеки FirstLib.dll, экспортирующей одну функцию.

Листинг 1. Простая библиотека DLL

library FirstLib; function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; begin Result := Num1; if Num2 > Result then Result := Num2; if Num3 > Result then Result := Num3; end; < Экспортируем функцию Max3 >exports Max3; begin end.

Когда вы добавите подпрограмму в список exports, вы тем самым экспортируете подпрограмму по ее имени. Вы можете также экспортировать подпрограмму под другим именем с помощью директивы name или посредством порядкового значения, используя директиву index. Однако применять директиву index не рекомендуется.

Ниже показан пример экспортирования директивы посредством порядкового значения или под другим именем:

exports Max3 name 'MyMax3Function', SaySomething index 1;

Статическая загрузка является самым простым из двух возможных способов загрузки библиотеки DLL. Статическую загрузку называют еще динамическим подключением во время загрузки (load-time dynamic linking), потому что используемые библиотеки DLL автоматически загружаются во время запуска приложения.

Чтобы статически загрузить библиотеку DLL, необходимо скопировать объявление подпрограммы и вызывающее приложение и пометить ее с помощью директивы external, которая сообщает компилятору о том, что подпрограмма находится либо в объектном файле, либо в библиотеке DLL.

Когда вы импортируете подпрограммы из библиотеки DLL, вы должны помечать их директивой external, указывая вслед за ней имя библиотеки DLL, в которой содержится реализация подпрограммы. Далее показан пример импорта функции МахЗ из библиотеки FirstLib.dll:

function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; external 'FirstLib.dll';

При желании можете даже переименовать подпрограмму во время ее импорта. Для этого необходимо объявить подпрограмму под другим именем, а в конце объявления указать первоначальное имя с помощью директивы name:

function Max(Num1, Num2, Num3: Integer): Integer; stdcall; external 'FirstLib.dll' name 'Max3';

Вы можете также импортировать функцию из библиотеки DLL. Для этого нужно создать модуль импорта и написать стандартный заголовок подпрограммы в разделе interface, а ее внешнюю реализацию — в разделе implementation этого модуля. В листинге 2 показан полный код модуль импорта библиотеки FirstLib.dll.

Листинг 2. Модуль импорта библиотеки FirstLib.dll.

unit FirstLibInf; interface function Max3(Num1, Num2, Num3: Integer): Integer; stdcall; implementation const FirstLib = 'FirstLib.dll'; function Max3; external FirstLib; end.

После того как вы создадите библиотеку DLL и ее модуль импорта, протестируйте библиотеку DLL, чтобы убедиться в том. что подпрограмма работает нормально. Поскольку запустить саму библиотеку DLL нельзя, нужно создать тестовое приложение, которое будет обращаться к библиотеке DLL. Быстрее всего сделать это можно, если создать проектную группу, добавив новый проект в текущий проект. Для этого потребуется щелкнуть правой кнопкой мыши на элементе ProjectGroup1 в окне Project Manager (Диспетчер проекта) и выбрать в контекстном меню команду Add New Project, как показано на рис. 1.

Листинг 3. Проверка подпрограммы Max3, импортированной из библиотеки FirstLib.dll.

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, FirstLibInf, StdCtrls; type TMainForm = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Max3Button: TButton; procedure Max3ButtonClick(Sender: TObject); private < Private declarations >public < Public declarations >end; var MainForm: TMainForm; implementation procedure TMainForm.Max3ButtonClick(Sender: TObject); var LargestNumber: Integer; begin LargestNumber := Max3(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text)); MessageDlg(Format('Наибольшее число: %d.', [LargestNumber]), mtInformation, [mbOK], 0); end; end.

Используемая литература: Внутренний мир Borland Delphi 2006. Иван Хладни.

Создание библиотеки DLL на C++

В этой заметке рассказывается как создать простую DLL-библиотеку, а затем — подключить ее к своей программе. Запускаем Visual Studio и создаём проект библиотеки DLL, назовём его myDLL. Добавляем в проект новый файл myDLL.h , поместим в него следующий код:

#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;

Теперь найдём в проекте файл myDLL.cpp и заменим его код следующим:
#include «stdafx.h» #include «myDll.h» #include using namespace std; int MyDLL::testSumma(int a, int b)

Библиотека из одной функции готова, но вы можете добавить туда другие функции. Попробуем использовать эту библиотеку в другом проекте. В Visual Studio создайте консольное приложение testMyDLL, снимите флажочек Precompiled header . Для использования в приложении функций, созданных в библиотеке DLL, необходимо сослаться на эту библиотеку. В свойствах проекта выберите Common Properties->References , добавьте новую ссылку на myDLL, нажав кнопку «Add New Reference…». Не забудьте прописать путь к файлу myDLL.h из предыдущего проекта библиотеки DLL. Замените кода файла testMyDLL.cpp следующим:

#include #include «myDll.h» using namespace std; int main()
Запускаем приложение testMyDLL и смотрим результат:

a = 5, b = 10 a + b = 15

06.08.2023 в 17:18 #8999
Без Visual Studio тоже можно собрать. Исходный код библиотеки ( my_dll.h ):

#ifdef MYDLL_EXPORTS #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endif class MyDLL < public: // Returns a + b static MYDLL_API int testSumma(int a, int b); >;

Исходный код библиотеки ( my_dll.cpp ):
#include «my_dll.h» using namespace std; int MyDLL::testSumma(int a, int b)

Собрать библиотеку можно такой командой:
gcc -shared -o my.dll my_dll.cpp -Wl,—output-def,my_dll.def,—out-implib,my_dll.a На выходе помимо dll-файла формируется .a и .def файлы. Чтобы использовать библиотеку, копируем .dll и .h файлы в каталог проекта и собираем его так: g++ main.cpp -o main.exe -L. -lmy
Опция -lmy приводит к подключению к проекту библиотеки my.dll.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *