вторник, 20 марта 2012 г.

Динамическое и статическое подключение DLL

Постараюсь кратко рассказать про подключение библиотек DLL. Но сначала ещё немного поработаем с элементами интерфейса. О том как создать простое диалоговое приложение с помощью MFC я уже писал.

Первым делом приложение должно позволять вводить какое-то число, и нам также необходимо по нажатию кнопки как-то выцепить это число из edit box'а. Делается это так.

Нажимаем на заготовке (каркасе) приложения правой кнопкой мыши на нужный элемент и добавляем новую переменную.


Нам необходимо две переменные. Одна будет предоставлять методы для Edit Box - такие как получение значения из этого поля. 


Вторая переменная просто будет хранить значения типа INT, полученные из Edit Box. Эту переменную можно было и вручную написать в .h файле, отвечающим за интерфейс, но мы её добавим по-ленивому.

   

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

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

void CMFC22Dlg::OnBnClickedButton1()

{
// TODO: Add your control notification handler code here
CString s;
m_CEdit1.GetWindowTextA(s);
m_INTedit1 = atoi(s);
AfxMessageBox(s);
}

Результат посмотрите сами.

Наконец о подключении библиотек!

Статическое подключение. Используется понятие "раннее связывание". Это значит, что DLL "прикрепляется" на этапе компиляции - compile-time. Это самый простой способ подключения, но для него необходимы следующие файлы: сама .DLL, хидер с описанием функций .h, и библиотечный файл .lib - все они создаются при компиляции библиотеки и закидываются в проект, требующий подключения библиотек.

Для подключения требуется вписать вот такой код:
// статическое подключение DLL

#include "myStatLib.h"
#pragma comment(lib, "myStatLib.lib")

Теперь можно напрямую вызвать необходимые функции из dll.

Динамическое подключение. Использует "позднее связывание" или run-time. Подгрузка библиотеки происходит только при вызове функции. Разумеется придется самим контролировать процесс выгрузки библиотеки. Следующий код прописан в .h файле - тут определяется сначала тип указатель на функцию, а потом переменная callFDLL, являющаяся указателем на функцию. hlib - какая-то winapi структура, которая будет содержать описание подсоединенной DLL'ки. Готовую dll необходимо скопировать в проект.
protected:// типы для динамической загрузки DLL

typedef void (WINAPI *MYPROC)();
MYPROC callFDLL;
HMODULE hlib;

В обработчик второй кнопки должны добавить следующее:
void CMFC1Dlg::OnBnClickedButton2()

{
CString s;
EditControl2.GetWindowTextA(s);
m_edit2Value = atoi(s);

hlib = LoadLibrary("dllG.dll");
callFDLL = (MYPROC) GetProcAddress(hlib,"CLDyn");

FreeLibrary(hlib);
}

CLDyn - имя функции, которую мы вызываем из dll.

Создать DLL. Не буду описывать опять процесс создания проекта в MSVS - там методом научного тыка всё можно создать. Но код простейшей dll стоит выложить.

Файл dllG.h
extern __declspec(dllexport) void CLDyn(const int NN);

Файл dllG.cpp
#include <windows.h>


extern __declspec(dllexport) void CLDyn()
{
MessageBoxA(GetActiveWindow(),(LPCSTR)("Hello from Dynamic Loaded Library!"),(LPCSTR)("Hi"),MB_OK | MB_APPLMODAL);
}

Файл dllG.def - для динамического подключения этот файл необходим, т.к. позволяет определить нормальные названия функций.
LIBRARY "dllG"

EXPORTS
CLDyn @1



Комментариев нет:

Отправить комментарий