Как подключить dll библиотеку в visual studio (c++)?
Если кратко, то dll можно подключить двумя способами:
В первом случае для подключения необходимы: файл заголовка (.h), библиотека импорта (.lib), сама библиотека dll(*.dll). Файл заголовка через #include подключаем туда, где собираемся использовать библиотеку, компоновщику указываем на библиотеку импорта (применительно к vs в свойствах проекта компоновщик->ввод->дополнительные зависимости) и указываем, где искать саму dll (через переменную PATH или в свойствах проекта, например отладка->окружение).
Во втором случае с помощью функции LoadLibrary подгружаем dll, получаем указатель на интересующий объект с помощью функции GetProcAddress, используем.
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); . HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer DWORD dwParam1; UINT uParam2, uReturnVal; hDLL = LoadLibrary("MyDLL"); if (hDLL != NULL) < lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1"); if (!lpfnDllFunc1) < // handle the error FreeLibrary(hDLL); return SOME_ERROR_CODE; >else < // call the function uReturnVal = lpfnDllFunc1(dwParam1, uParam2); >>
Как подключить dll библиотеку в visual studio (c++)?

Для компиляции:
1. Необходимо добавить путь к инклудам в список инклуд-директорий компилятора.
2. Необходимо добавить путь к lib-файлам в список библиотечных директорий линковщика.
3. Необходимо указать требуемые lib файлы как зависимости вашего проекта.
В рантайме необходимо положить нужный dll рядом с exe.
Создаем и подключаем DLL
Сейчас мы рассмотрим для чего нужны DLL (Dynamic Link Library — динамически компануемая библиотека) и как их создавать. DLL- это участок кода хранимый в файле с расширением .dll. Код может быть использован другими программами, но сама посебе библиотека прораммой не является. Вобщем-то, динамически компонуемые библиотеки представляют собой набао скомпилированныых функций. Но у ютих библиотек есть свой особенности, так например, если каккието две или более программы для Windows одновременно исполняются и используют функции, находящиеся в одной DLL, то в памяти будет постоянно находится только одна библиотека, обеспечивая тем самым экономное расходование памяти. Загрузка библиотеки в память может быть статической и динамической.
При статической загрузке DLL автоматически загружается при запуске исользующего ее приложения. Такая DLL содержит экспортируемые функции, описание которых находится в файле библиотеки импорта(import library file — .lib). Для использования статической загрузки вы должны на этапе компоновки к программе додключить .lib файл вашей DLL. В C++ Builder это сводится к включения в проект .lib файла через менджер проектов.
При диамической загрузке вы можете загружать DLL при необходимости, выгрузить ее когода она ненужна. Однако работать с такими библиотеками сложнее чем со статическими. Рассмотрим созздание и использование DLL статической загрузки.
Статическая загрузка
Создадим сперва проект (File / New / DLL). Будет создан проект, содержащий следующее:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
и длинный коментарий предупреждающий вас о том, что для работо способности вашей DLL необходимо снеи обеспечить поствку некоторых dll если вы используете экземпляры класса String.
Для экспорта и импорта из DLL необходимо использовать моди фикаторы __export и __import соответсвенно. Но в C++ Builder можно использовать новое ключевое слово __delspec() с параметрами dllexport и dllimport соответсвенно. Сами понимаете, что для того чтобы эспортировать функции из библиотеки еужен один заголовочный файл с описаниями _delspec(dllexport) для экспортируемых функций, для импорта функций в приложение вам необходимо будет поставить анологичный заголовочный файл но с _delspec(dllimport) описаниями, что достаточно неудобно. Эта проблема решается легко: добавте в заголовочный файл библиотеки следующее:
#if defined(BUILD_DLL) # define DLL_EXP __declspec(dllexport) #else # if defined(BUILD_APP) # define DLL_EXP __declspec(dllimport) # else # define DLL_EXP # endif #endif
в исходном файле DLL напишите #define BUILD_DLL, а вместо __declspec(dllexport) пишите DLL_EXP. При написании программы добавте строчку #define BUILD_APP, и просто подключите заголовочный файл DLL.
Пример DLL: файл P.cpp
//--------------------------------------------------------------------------- #define BUILD_DLL #include #include "p.h" #pragma hdrstop //--------------------------------------------------------------------------- // Important note about DLL memory management when your DLL uses the // static version of the RunTime Library: // // If your DLL exports any functions that pass String objects (or structs/ // classes containing nested Strings) as parameter or function results, // you will need to add the library MEMMGR.LIB to both the DLL project and // any other projects that use the DLL. You will also need to use MEMMGR.LIB // if any other projects which use the DLL will be perfomring new or delete // operations on any non-TObject-derived classes which are exported from the // DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling // EXE's to use the BORLNDMM.DLL as their memory manager. In these cases, // the file BORLNDMM.DLL should be deployed along with your DLL. // To avoid using BORLNDMM.DLL, pass string information using "char *" or // ShortString parameters. // // If your DLL uses the dynamic version of the RTL, you do not need to // explicitly add MEMMGR.LIB as this will be done implicitly for you //------------------------------------------------------------------------- int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) < return 1; >//------------------------------------------------------------------------- void Message(char *s) < i=10; Application->MessageBox(s,"From DLL",IDOK); >
#if defined(BUILD_DLL) # define DLL_EXP __declspec(dllexport) #else # if defined(BUILD_APP) # define DLL_EXP __declspec(dllimport) # else # define DLL_EXP # endif #endif DLL_EXP void Message(char *s); DLL_EXP int i;
Если вы нажмете Run то после завершенния построения будет выдано сообщение что данная программа не можнт быть исполнена (естественно). Теперь напишем вызывающую программу. Втомже каталоге создайде новый проект (File / New Application) в форму поместите одну кнопку и создай обработчик события OnClick. Ваш исполняемый файл должен представлять собой слдующее:
//--------------------------------------------------------------------------- #include #define BUILD_APP #pragma hdrstop #include "p.h" #include "Unit1.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) < >//------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) < char c[10]; Message("roma"); for( ; i>0;i--) < sprintf(c,"Example %d",i ); Application->MessageBox("Example of using DLL variable",(char*)c,IDOK); > > //-------------------------------------------------------------------------
Не забудьте об объявлениях в начале файла. Зайдите в менеджер проектов.Там откройте свой проект и добавте .lib файл из предыдушего проект с DLL( правый клик, пункт ADD). Запустите проект.
Как видите, для того, чтобы вашу DLL можно было использовать необходимо три файла: сама DLL, заголовочный файл и библиотечный файл .lib.
Динамическая загрузка
Динамическая загрузка горазда сложнее. Однако для динамической загрузки требуется только сама DLL ( не ненужен ни .lib ни заголовочный файл, хотя его можно исполбзовать для описания экспортируемых функций для предполагемого пользователя).
Давайте рассмотрим на примере, как производится динамическая загрузка. Создайте новый прокт DLL и внесите в него следующее:
extern "C" void __export Message(char *s) < Application->MessageBox(s,"From DLL",IDOK); >
Cкомпилируйте проект, в результате чего будет создана DLL.
Теперь создайте проект приложения анологичный проекту для использования статической загрузки (форма с кнопкой и обработчиком события кнопки OnClick) ниже приведен код приложения:(Unit11.cpp)
//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit11.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) < >//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) < void (__stdcall *Message)(char *s); HINSTANCE dllp = LoadLibrary("p.dll"); if (dllp) < Message= (void(__stdcall *) (char*)) GetProcAddress(dllp, "_Message"); if (Message) Message("Hi From Dinamic DLL"); >FreeLibrary(dllp); > //---------------------------------------------------------------------------
запустите это проект, при нажатии на кнопку должно выдаватся сообшение. Теперь разберемся, как это работает.
- void (__stdcall *Message)(char *s);-объявление указателя на функцию.
- HINSTANCE dllp = LoadLibrary(«p.dll»);— загрузка библиотеки в память.
- Message= (void(__stdcall *) (char*)) GetProcAddress(dllp, «_Message»); присвоение указателю адреса функции DLL.
- Message(«Hi From Dinamic DLL»); рабочий вызов фунциий (собственно то для чего все это и делается).
- FreeLibrary(dllp);— выгрузка библиотеки из памяти.
Обратите внимание на то, что призагрузке можно указать точное местоположние библиотеки (необезательно в том же каталоге где и приложение).
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Динамическое подключение dll в Си
В этой статье речь пойдет о динамическом подключении библиотеки dll к программе, разрабатываемой в Visual Studio. Иначе говоря, будет написан клиент к dll-файлу. Разработку будем вести на языке программирования Си.
Динамическое подключение dll (в отличие от статического через References) позволяет экономить ресурсы: библиотека загружается не при запуске программы, а во время ее выполнения, когда действительно необходимо обратится к функциям библиотеки. Dll будет загружена при выполнении соответствующего оператора.
В статье «Как создать dll в Visual Studio» мы написали библиотеку dll с двумя функциями: add и sub, которые соответственно складывают и вычитают два целых числа. Теперь напишем на языке программирования Си клиент к этому dll-файлу.
Создадим в Visual Studio консольное приложение и поместим в папку проекта Dubug dll-файл.

Перейдем к коду приложения. Для начала подключим необходимые библиотеки.