
- •ЛЕКЦІЯ 5
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ
- •ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJ
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DIALOGLNDLG.DLL, РЕАЛІЗОВАНИЙ НА MFC
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ

ЛЕКЦІЯ 5
Дінамичні бібліотеки в ОС Windows
Операційні системи доц. Сінельнікова Т.Ф.

ДИНАМІЧНІ БІБЛІОТЕКИ
Виконувані файли Windows бувають у двох варіантах:
програми (program);
бібліотеки динамічного компонування (dynamic link library, DLL).
За замовчуванням, коли створюється додаток, генерується файл програми - ЕХЕ. Часто програми звертаються до функцій, що зберігається в бібліотеках виду DLL. При кожному безпосередньому виконанні функції Windows API в дійсності відбувається звернення до DLL.
2
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ДИНАМІЧНІ БІБЛІОТЕКИ
Головна відмінність DLL від програм полягає в тому, що DLL не є виконуваною програмою, навіть коли вона завантажена в пам'ять,
оскільки DLL це всього лише сукупність процедур і функцій, що викликаються іншими програмами. Ці процедури і функції використовують стек програми, що викликала їх, а точніше, програмного потоку. Інша ключова відмінність бібліотеки від програми полягає в тому, що бібліотека не створює свій власний стек, а користується стеком програми, що викликала її. Бібліотека DLL завантажується в адресний простір програми, і тому будь-які розміщення DLL і створюваних нею глобальних даних постійно залишаються в адресному просторі головного процесу.
3
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ДИНАМІЧНІ БІБЛІОТЕКИ
При розробці динамічних бібліотек необхідно вирішувати два основних завдання:
розробити власну бібліотеку;
розробити програму, яка буде використовувати функції з бібліотеки.
При розробці бібліотек в Visual C++ (втім як і в будь-якому іншому |
|
середовищі розробки) необхідно спочатку створити бібліотеку, а потім |
|
підключити її до головного додатку, тобто того, що її викликає. Для створення |
|
бібліотеки в середовищі Visual C++ можна скористатися вбудованими |
|
засобами середовища розробки. При створенні нової програми можна |
|
вибрати варіант створення бібліотеки на основі MFC або ж на основі |
|
стандартних Win32 API функцій. Залежно від цього вибору буде згенеровано |
|
відповідний шаблон бібліотеки. Далі в ці шаблони необхідно помістити |
|
вихідний код функцій, які повинні бути реалізовані в бібліотеці. |
4 |
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

РОЗРОБКА ДИНАМІЧНИХ БІБЛІОТЕК В VISUAL C++
Процес створення і використання динамічної бібліотеки розглянемо на наступному прикладі. Розробимо один головний додаток і дві бібліотеки. Одну бібліотеку розробимо з використанням MFC (бібліотека DialogInDlg.DLL), а другу з використанням Win32 API (бібліотека DllWin32API.DLL). Архітектура програми приведена на малюнку нижче.
5
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

РОЗРОБКА ДИНАМІЧНИХ БІБЛІОТЕК В VISUAL C++
У першій бібліотеці реалізуємо діалогове вікно. У цій програмі введені дані будуть складатися попарно, а потім результати будуть відображуватися у вікні головної програми. Інтерфейси програми матимуть вигляд як наведено на малюнку.
Головне вікно додатку
Реалізоване у бібліотеці діалогове вікно |
6 |
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ
#include "stdafx.h" TSTPROJ #include "TstProj.h"
#include "TstProjDlg.h" #include ".\tstprojdlg.h" #include ".\shlwapi.h"
#ifdef _DEBUG
#define new DEBUG_NEW #endif
CTstProjDlg::CTstProjDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTstProjDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTstProjDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_FORM, m_editForm);
}
BEGIN_MESSAGE_MAP(CTstProjDlg, CDialog)
ON_BN_CLICKED(ID_FORM, OnBnClickedForm)
END_MESSAGE_MAP()
BOOL CTstProjDlg::OnInitDialog()
{
|
CDialog::OnInitDialog(); |
|
|
SetIcon(m_hIcon, TRUE); |
|
|
SetIcon(m_hIcon, FALSE); |
|
|
return TRUE; |
7 |
} |
|
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJ
__declspec(dllimport) LPCTSTR GetResults(); void CTstProjDlg::OnBnClickedForm()
{
HMODULE hDll = ::LoadLibrary(_T("DllWin32API.dll")); if(!hDll)
{
AfxMessageBox("Ошибка LoadLibrary!"); return;
}
AfxMessageBox("Функция LoadLibrary выполнена успешно !"); void (*pfn)();
pfn = (void (*)()) ::GetProcAddress(hDll,_T("MyFunc")); if(!pfn)
{
AfxMessageBox("Ошибка GetProcAddress!"); return;
}
pfn();
::FreeLibrary(hDll);
LPCTSTR psz = GetResults(); if(psz)
{
m_editForm.SetWindowText(psz); delete psz;
}
}
8
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ВИХІДНИЙ КОД БІБЛІОТЕКИ DIALOGLNDLG.DLL, РЕАЛІЗОВАНИЙ НА MFC
Файл заголовка *.H для данного модуля.
#pragma once
#ifndef __AFXWIN_H__
#error include 'stdafx.h' #endif
#include "resource.h" #include "afxcoll.h"
class CDialogInDlgApp : public CWinApp
{
public:
CDialogInDlgApp();
public:
virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP()
};
Исходный код библиотеки
#include "stdafx.h" #include "DialogInDlg.h" #include "dlg.h"
#include "shlwapi.h"
#ifdef _DEBUG #define new DEBUG_NEW
#endif
BEGIN_MESSAGE_MAP(CDialogInDlgApp, CWinApp)
END_MESSAGE_MAP() |
|
CDialogInDlgApp::CDialogInDlgApp() |
|
{ |
|
} |
|
CDialogInDlgApp theApp; |
|
BOOL CDialogInDlgApp::InitInstance() |
|
{ |
|
CWinApp::InitInstance(); |
9 |
return TRUE; |
}
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
#include "stdafx.h" #include "DialogInDlg.h" #include "Dlg.h" #include ".\dlg.h"
IMPLEMENT_DYNAMIC(CDlg, CDialog)
CDlg::CDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDlg::IDD, pParent)
,m_strVal11(_T(""))
,m_strVal12(_T(""))
,m_strVal21(_T(""))
,m_strVal22(_T(""))
,m_strVal31(_T(""))
,m_strVal32(_T(""))
,m_strVal41(_T(""))
,m_strVal42(_T(""))
{
}
CDlg::~CDlg()
{
}
10
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua