Схема динамического и статического подключения C/C++ библиотеки

Post date: Sep 30, 2011 3:22:11 PM

Создание библиотеки в Visual Studio

  1. Выполнить команду контекстного меню File->New Project

  2. Выбрать тип проекта Visual C++ -> Win32 -> Win32 Console Application

  3. Ввести имя проекта

  4. Нажать на кнопку Create

  5. Нажать на кнопку Next

  6. Выбрать Application Type равным DLL

  7. Установить Additional Options равными Empty Project

  8. Нажать на кнопку Finish

  9. Добавить необходимые заголовочные файлы в папку Header Files. Например, добавим файл header.h, в котором разместим объявления функций.

  10. Добавить необходимые файлы исходных кодов в папку Source Files. Например, добавим файл source.cpp, в котором разместим реализации.

Содержимое заголовочного файла:

#ifndef __HEADER_H

#define __HEADER_H

extern "C" __declspec(dllexport) int TestFunction(int w, int h);

#endif

Содержимое файла исходных кодов:

#include "header.h"

int TestFunction(int w, int h)

{

return w * h;

}

Создание консольного приложения

  1. Выполнить команду контекстного меню File->New Project

  2. Выбрать тип проекта Visual C++ -> Win32 -> Win32 Console Application

  3. Ввести имя проекта

  4. Нажать на кнопку Create

  5. Нажать на кнопку Next

  6. Выбрать Application Type равным Console Application

  7. Установить Additional Options равными Empty Project

  8. Нажать на кнопку Finish

Статическое подключение библиотеки в консольное приложение

  1. Добавить в проект в папку Resources Files скомпилированный lib-файл библиотеки.

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

В продолжении примера, это можно сделать следующим образом:

extern "C" __declspec(dllimport) int TestFunction(int w, int h);

void main()

{

int w = 10, h = 10;

int multi = TestFunction(w, h);

}

Динамическое подключение библиотеки в консольное приложение

Динамическое подключение предполагает, что библиотека подключается в приложение в момент его исполнения. Для этого необходимо использовать функцию библиотеки windows.h - LoadLibrary. Например, это можно реализовать следующим образом:

#include <stdio.h>

#include <windows.h>

// тип указателя на функцию, имеющей прототип, который совпадает с прототипом импортируемой из библиотеки функции

typedef int (*TESTFUNCTION)(int, int);

void main()

{

int w = 10, h = 10, multi;

DWORD err;

HINSTANCE hDll = LoadLibrary("dll.dll"); // dll.dll - название подключаемой библиотеки

if (hDll != NULL)

{

printf("Library was loaded\n");

}

else

{

err = GetLastError();

printf("Couldn't load dll. Error code %d\n", err);

return;

}

// получение указателя на функцию библиотеки

TESTFUNCTION lpTestFunction = (TESTFUNCTION)GetProcAddress(hDll, "TestFunction");

if (lpTestFunction != NULL)

{

multi = (*lpTestFunction) (w, h);

printf("multi = %d\n", multi);

}

// освобождение дескриптора

FreeLibrary(hDll);

}

Подключение библиотеки в Windows Forms приложение

  1. Добавить ссылку на проект библиотеки (References).

  2. Изменить в свойствах оконного приложения опцию компиляции на /clr.

  3. Отключить использование Precompiled Headers.

  4. Прописать пути до заголовочных файлов библиотеки в свойствах проекта. Указать относительные пути, чтобы не было проблем при переносе проекта.

  5. В исходных кодах приложения подключить необходимые заголовочные файлы.

Пример объявления и реализации класса можно найти на http://msdn.microsoft.com/en-US/library/ms235636(v=VS.80).aspx.

Примечания:

Такая схема экспортирования функций библиотеки удобна в случае C-библиотеки. При наличии классов, содержащих виртуальные методы, возникает проблема линковки, если объявление и реализация разнесены в разных файлах. Решение:

  1. Писать реализацию прямо при объявлении, что наименее предпочтительно.

  2. Создавать библиотеку с поддержкой clr (для этого создаем библиотеку по схеме, описанной выше, и выставляем в свойствах проекта Configuration Properties -> General -> Common Language Runtime Support опцию Common Language Runtime Support(/clr)) (пример библиотеки clrDll в архиве dlltest+WinForms+CRL DLL.7z). При подключении библиотеки в проект необходимо добавить ссылку на проект библиотеки (правой кнопкой мыши по проекту, Add References..., Add New Reeference и выбираем проект библиотеки) (пример консольного приложение app4 в dlltest+WinForms+CRL DLL.7z).