Разделы презентаций


Дінамичні бібліотеки в ОС Windows Операційні системи

Содержание

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

Слайды и текст этой презентации

Слайд 1ЛЕКЦІЯ 5

Дінамичні бібліотеки в ОС Windows










Операційні системи
доц. Сінельнікова Т.Ф.

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

Слайд 2ДИНАМІЧНІ БІБЛІОТЕКИ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Виконувані файли Windows бувають

у двох варіантах:
програми (program);
бібліотеки динамічного компонування

(dynamic link library, DLL).

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

Слайд 3ДИНАМІЧНІ БІБЛІОТЕКИ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Головна відмінність DLL від

програм полягає в тому, що DLL не є виконуваною програмою,

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

Слайд 4ДИНАМІЧНІ БІБЛІОТЕКИ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
При розробці динамічних бібліотек

необхідно вирішувати два основних завдання:
розробити власну бібліотеку;

розробити програму, яка буде використовувати функції з бібліотеки.

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

Слайд 5РОЗРОБКА ДИНАМІЧНИХ БІБЛІОТЕК В VISUAL C++
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Процес створення і використання динамічної бібліотеки розглянемо на наступному прикладі.

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

Слайд 6РОЗРОБКА ДИНАМІЧНИХ БІБЛІОТЕК В VISUAL C++
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
У першій бібліотеці реалізуємо діалогове вікно. У цій програмі введені

дані будуть складатися попарно, а потім результати будуть відображуватися у вікні головної програми. Інтерфейси програми матимуть вигляд як наведено на малюнку.






Головне вікно додатку


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

Слайд 7ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
#include

"stdafx.h"
#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;
}

Слайд 8ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
__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;
}
}

ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua__declspec(dllimport) LPCTSTR GetResults();void CTstProjDlg::OnBnClickedForm(){	HMODULE hDll = ::LoadLibrary(_T(

Слайд 9ВИХІДНИЙ КОД БІБЛІОТЕКИ DIALOGLNDLG.DLL, РЕАЛІЗОВАНИЙ НА MFC
Операційні системи. Кафедра

Інформатики. E-mail: informatika@kture.kharkov.ua
Исходный код библиотеки
#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();
return TRUE;
}

Файл заголовка *.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()
};

ВИХІДНИЙ КОД БІБЛІОТЕКИ DIALOGLNDLG.DLL, РЕАЛІЗОВАНИЙ НА MFC Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaИсходный код библиотеки#include

Слайд 10МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
Операційні системи.

Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
#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()
{
}
МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLLОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua#include

Слайд 11МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
Операційні системи.

Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_VAL11, m_edit11); DDX_Control(pDX, IDC_VAL12,

m_edit12); DDX_Control(pDX, IDC_VAL21, m_edit21);
DDX_Control(pDX, IDC_VAL22, m_edit22); DDX_Control(pDX, IDC_VAL31, m_edit31); DDX_Control(pDX, IDC_VAL32, m_edit32);
DDX_Control(pDX, IDC_VAL41, m_edit41); DDX_Control(pDX, IDC_VAL42, m_edit42); DDX_Text(pDX, IDC_VAL11, m_strVal11);
DDX_Text(pDX, IDC_VAL12, m_strVal12); DDX_Text(pDX, IDC_VAL21, m_strVal21); DDX_Text(pDX, IDC_VAL22, m_strVal22);
DDX_Text(pDX, IDC_VAL31, m_strVal31); DDX_Text(pDX, IDC_VAL32, m_strVal32); DDX_Text(pDX, IDC_VAL41, m_strVal41);
DDX_Text(pDX, IDC_VAL42, m_strVal42);
}
BEGIN_MESSAGE_MAP(CDlg, CDialog)
ON_EN_CHANGE(IDC_VAL11, OnEnChangeVal11)
ON_EN_CHANGE(IDC_VAL12, OnEnChangeVal12)
ON_EN_CHANGE(IDC_VAL21, OnEnChangeVal21)
ON_EN_CHANGE(IDC_VAL22, OnEnChangeVal22)
ON_EN_CHANGE(IDC_VAL31, OnEnChangeVal31)
ON_EN_CHANGE(IDC_VAL32, OnEnChangeVal32)
ON_EN_CHANGE(IDC_VAL41, OnEnChangeVal41)
ON_EN_CHANGE(IDC_VAL42, OnEnChangeVal42)
END_MESSAGE_MAP()
МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLLОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uavoid CDlg::DoDataExchange(CDataExchange* pDX){	CDialog::DoDataExchange(pDX);	DDX_Control(pDX, IDC_VAL11,

Слайд 12МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
Операційні системи.

Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
BOOL CDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_edit11.SetWindowText(_T("0")); m_edit12.SetWindowText(_T("0"));
m_edit21.SetWindowText(_T("0")); m_edit22.SetWindowText(_T("0"));
m_edit31.SetWindowText(_T("0")); m_edit32.SetWindowText(_T("0"));
m_edit41.SetWindowText(_T("0")); m_edit42.SetWindowText(_T("0"));
return

TRUE;
}
void CDlg::OnEnChangeVal11()
{
CString str;m_edit11.GetWindowText(str);
if(str.IsEmpty()) m_edit11.SetWindowText(_T("0"));
}
void CDlg::OnEnChangeVal12()
{
CString str;m_edit12.GetWindowText(str);
if(str.IsEmpty()) m_edit12.SetWindowText(_T("0"));
}
МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLLОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaBOOL CDlg::OnInitDialog(){	CDialog::OnInitDialog();	m_edit11.SetWindowText(_T(

Слайд 13МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
Операційні системи.

Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
void CDlg::OnEnChangeVal21()
{
CString str;m_edit21.GetWindowText(str);
if(str.IsEmpty()) m_edit21.SetWindowText(_T("0"));
}
void CDlg::OnEnChangeVal22()
{
CString str;m_edit22.GetWindowText(str);
if(str.IsEmpty()) m_edit22.SetWindowText(_T("0"));
}
void

CDlg::OnEnChangeVal31()
{
CString str;m_edit31.GetWindowText(str);
if(str.IsEmpty()) m_edit31.SetWindowText(_T("0"));
}
МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLLОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uavoid CDlg::OnEnChangeVal21(){	CString str;m_edit21.GetWindowText(str);	if(str.IsEmpty()) m_edit21.SetWindowText(_T(

Слайд 14МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
Операційні системи.

Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
void CDlg::OnEnChangeVal32()
{
CString str;m_edit32.GetWindowText(str);
if(str.IsEmpty()) m_edit32.SetWindowText(_T("0"));
}
void CDlg::OnEnChangeVal41()
{
CString str; m_edit41.GetWindowText(str);
if(str.IsEmpty())

m_edit41.SetWindowText(_T("0"));
}
void CDlg::OnEnChangeVal42()
{
CString str; m_edit42.GetWindowText(str);
if(str.IsEmpty()) m_edit42.SetWindowText(_T("0"));
}
void CDlg::OnOK()
{
UpdateData();
CDialog::OnOK();
}
МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLLОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uavoid CDlg::OnEnChangeVal32(){	CString str;m_edit32.GetWindowText(str);	if(str.IsEmpty()) m_edit32.SetWindowText(_T(

Слайд 15ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
Операційні системи. Кафедра

Інформатики. E-mail: informatika@kture.kharkov.ua
#include "stdafx.h"
#include "windows.h"
#include "DllWin32API.h"
BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call, LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: return InitInstance(); break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH: return ExitInstance(); break;
}
return TRUE;
}
ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 APIОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua#include

Слайд 16ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
Операційні системи. Кафедра

Інформатики. E-mail: informatika@kture.kharkov.ua
BOOL InitInstance()
{
MessageBox(NULL,"Сообщение от InitInstance !","InitInstance",MB_OK);
return TRUE;
}
BOOL ExitInstance()
{
MessageBox(NULL," Сообщение

от ExitInstance !","ExitInstance",MB_OK);
return TRUE;
}
extern "C" __declspec(dllexport) void MyFunc()
{
MessageBox(NULL,"Сообщение тестовой функции MyFunc","MyFunc",MB_OK);
};
ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 APIОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaBOOL InitInstance(){	MessageBox(NULL,

Слайд 17ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
Операційні системи. Кафедра Інформатики.

E-mail: informatika@kture.kharkov.ua
Файл заголовка *.H для этого модуля
BOOL InitInstance();
BOOL ExitInstance();
extern

"C" __declspec(dllexport) void MyFunc();

Бібліотека DialogInDlg.DLL підключається до головного додатку за допомогою бібліотеки статичної компоновки DialogInDlg.LIB, яка вказується в параметрах проекту, як показано на малюнку.

ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКАОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaФайл заголовка *.H для этого модуля

Слайд 18ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
Операційні системи. Кафедра Інформатики.

E-mail: informatika@kture.kharkov.ua

ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКАОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

Слайд 19ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Даний

спосіб підключення обумовлює і спосіб виклику функцій з бібліотеки. Функція,

яка повинна викликатися з бібліотеки описується таким чином у файлі, реализуючим бібліотеку (у прикладі вище всі важливі рядки виділені жирним шрифтом):
__declspec (dllexport) LPCTSTR GetResults ();
  У файлі, який буде викликати бібліотеку, перед функцією, в якій буде зроблений виклик функції з бібліотеки, вказується наступний рядок:
__declspec (dllimport) LPCTSTR GetResults ();
ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaДаний спосіб підключення обумовлює і спосіб виклику функцій

Слайд 20ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua
Функція

GetResults () і є функція, реалізована в бібліотеці. Взагалі кажучи,

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

Слайд 21ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Бібліотека DllWin32API.DLL підключається до додатку за допомогою стандартних функцій Win32

API, які здійснюють завантаження бібліотеки динамічно в пам'ять. Це виконує наступний фрагмент коду:

HMODULE hDll = ::LoadLibrary(_T("DllWin32API.dll"));
if(!hDll)
{
AfxMessageBox(«Помилка LoadLibrary!"); return;
}
ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaБібліотека DllWin32API.DLL підключається до додатку за допомогою

Слайд 22ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Після завантаження бібліотеки необхідно обов'язково перевіряти правильність завершення цієї операції.

Якщо бібліотека завантажена успішно, то можна здійснити отримання адреси функції експортованої з бібліотеки:

void (*pfn)();
pfn = (void (*)()) ::GetProcAddress(hDll,_T("MyFunc"));
if(!pfn)
{
AfxMessageBox(«Помилка GetProcAddress!"); return;
}
pfn(); // виконання функції, реализованої в бібліотеці


Після того як бібліотека стане не потрібна, її необхідно вивантажити з пам'яті за
допомогою функції FreeLibrary (hDll).
ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaПісля завантаження бібліотеки необхідно обов'язково перевіряти правильність

Слайд 23ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Розглянемо ще одну важливу особливість бібліотеки DllWin32API.DLL. Вона має функцію

точки входу в бібліотеку в явному вигляді, де програміст може легко задати цілий ряд дій на наступні події:

DLL_PROCESS_ATTACH - підключення процесу бібліотеки; DLL_THREAD_ATTACH - підключення потоку бібліотеки; DLL_THREAD_DETACH - відключення потоку бібліотеки; DLL_PROCESS_DETACH - відключення процесу бібліотеки.

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaРозглянемо ще одну важливу особливість бібліотеки DllWin32API.DLL.

Слайд 24ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
На кожну з цих подій розробник може перевизначити відповідну віртуальну

функцію. Нижче приведена функція точки входу до бібліотеки з розглянутого прикладу.

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: return InitInstance(); break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH: return ExitInstance(); break;
}
return TRUE;
}
ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaНа кожну з цих подій розробник може

Слайд 25ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
У прикладі визначені функції для подій DLL_PROCESS_ATTACH та DLL_PROCESS_DETACH. При

виконанні цих подій видаються відповідні повідомлення. Перше повідомлення з'являється при завантаженні бібліотеки, а друге при вивантаженні. В даній бібліотеці експортована функція описана так:
extern "C" __declspec (dllexport) void MyFunc ();

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaУ прикладі визначені функції для подій DLL_PROCESS_ATTACH

Слайд 26ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Наявність оголошення __declspec (dllexport) дає можливість використовувати цю функцію в

викликаючому додатку, більш того наявність оператора extern "С" робить цю функцію задовільною щодо договору по утворенню імен С. Якщо цей оператор пропустити, то компілятор С++ застосує перетворення імен. Це призведе до неможливості використання даної функції з програми на Delphi без додаткової директиви name, опис якої було дано при розгляді принципів розробки бібліотек на Delphi. Цей опис можна модифікувати таким чином:
extern "C" __declspec (dllexport) void WINAPI MyFunc ();

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaНаявність оголошення __declspec (dllexport) дає можливість використовувати

Слайд 27ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Операційні системи. Кафедра Інформатики. E-mail:

informatika@kture.kharkov.ua
Використання модифікатора WINAPI дасть можливість встановити потрібний спосіб передачі параметрів.

Це особливо важливо, якщо бібліотека буде використовуватися з програм написаних на Delphi. Зазначений модифікатор саме буде відповідати типу виклику stdcall, який підходить для використання в програмах на Delphi. Слід зазначити, що опис експортованої функції повинен бути обов'язково поміщений в файл заголовка *. H бібліотеки.

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИОпераційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.uaВикористання модифікатора WINAPI дасть можливість встановити потрібний

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика