Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Слайд_ОС_ПМ / OS-Lection-5.ppt
Скачиваний:
43
Добавлен:
05.06.2014
Размер:
1.06 Mб
Скачать

ЛЕКЦІЯ 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

Соседние файлы в папке Слайд_ОС_ПМ