Частина тексту файла (без зображень, графіків і формул):
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Лабораторна робота №6
з курсу
”Системне програмування ”
СТВОРЕННЯ БІБЛІОТЕК ДИНАМІЧНОГО КОМПОНУВАННЯ ТА ЇХ ВИКОРИСТАННЯ В РЕЖИМІ НЕЯВНОГО ЗВ’ЯЗУВАННЯ
Львів 2012
Мета: Ознайомитись з технологією створення та використання бібліотек динамічного компонування з використанням неявного зв’язування.
ТЕОРЕТИЧНІ ВІДОМОСТІ
DLL (англ. Dynamic-link library — динамічно завантажувана бібліотека) — реалізовані компанією Microsoft загальні бібліотеки в ОС Windows. Як правило бібліотеки мають розширення файлу *.dll, *.ocx (для бібліотек, що містять елементи керування ActiveX) або *.drv (драйвери старих версій ОС). Структура DLL така сама, як і в PE-файлів (Portable Executable) для 32-, 64-розрядних Windows, та New-Executable (NE) для 16-бітових Windows.
DLL може містити 2 типи функцій: експортні та внутрішні. Експортні функції визначаються за допомогою ключового слова __declspec(dllexport) і можуть бути викликані з програм, що завантажили динамічну бібліотеку, яка містить ці функції. Внутрішні функції – це функції, які використовуються в середині DLL і не можуть бути викликані ззовні.
DLL є модулем (module). Тобто, вона складається з: сегментів коду, сегментів ресурсів та одного сегменту даних. Крім цього DLL може містити точку входу. Точка входу – це функція DllMain, яка викликається при завантаженні або вивантажені бібліотеки потоком або процесом. Ця функція має наступний прототип:
BOOL APIENTRY DllMain(
HANDLE hModule, // Хендл DLL модуля
DWORD ul_reason_for_call, // Причина виклику
LPVOID lpReserved ); // Зарезервовано
Якщо DllMain повертає FALSE, то бібліотека вважається такою, що не завантажилася. При неявному зв’язуванні це призведе до відмови запуску програми, а при явному – помилки завантаження лише цієї бібліотеки.
В процесі виконання вміст бібліотеки залишається незмінним (сегменти коду та сегменти ресурсів), що дозволяє завантажувати її в пам’ять в єдиному екземплярі і використовувати багатьма завданнями одночасно. Використання dll дозволяє економити пам’ять, забезпечити модульність програм, полегшити процес встановлення програм.
Можливі 2 способи використання динамічних бібліотек. Вони називаються явним та неявним зв’язуванням. Явне та неявне зв’язування бібліотеки з програмою мають суттєві відмінності в процесі написання та компіляції програми.
Неявне зв’язування бібліотеки з програмою (Load-time dynamic linking) полягає в тому, що бібліотека (яка міститься у файлі з розширенням .dll) завантажується в пам’ять в момент завантаження програми. При відсутності бодай однієї з бібліотек при запуску програми відбудеться збій та припинення виконання програми.
Щоб реалізувати неявне зв’язування необхідно до проекту програми включити прототипи функцій, що містяться в бібліотеці та бібліотеку імпорту (має розширення .lib). На даному етапі наявність файлу з розширенням .dll не є необхідною. При компіляції лінкер створює виконавчий файл, який містить код, що забезпечує систему інформацією, яка необхідна для автоматичного завантаження бібліотеки з .dll файлу та інформацією, яка необхідна для зв’язування імен функцій у програмі з їх адресами у бібліотеці.
Неявне зв’язування дозволяє здійснювати виклик функцій з бібліотеки написанням коду програми в стилі притаманному мовам С\С++.
ЗАВДАНЯ:
Варіант:
11.Відредагувати заданий текст, перевертаючи слова з парними номерами. Наприклад, HOW DO YOU DO -> OD OD
Код програми:
*dll
*******Main.cpp*********
#include <iostream>
#include <stdio.h>
#include "dlltest.h"
using namespace std;
void f(char* k){
char ar[20][20]={0};
char* poch=k;
int index=0;
for(int i=0;*k!=0;k++,i++){
if(*k==' '){
for(int p=0;poch!=k;poch++,p++)
ar[index][p]=*poch;
index++;
poch++;
}
}
char tmp[20]={0};
int count=0;
for(int h=0;h<=index;h++)
if(h%2==1){
for(int i=0;ar[h][i]!=0;i++)
count++;
for(int i=0;ar[h][i]!=0;i++)
tmp[i]=ar[h][i];
for(int z=0;count!=0;z++){
ar[h][z]=tmp[count-1];
count--;
}
}
for(int i=0;i<4;i++)
cout<<ar[i]<<" ";
}
*******dlltest.h*******
#ifndef _DLLTEST_H_
#define _DLLTEST_H_
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
extern "C" __declspec(dllexport) void f(char *k);
#endif
Виклик функції
******main.cpp*****
#include "dlltest.h"
int main(){
char p[]="What do you do ";
f(p);
return 0;
}
Результат виконання програми
/
Висновок: я ознайомився з технологією створення та використання бібліотек динамічного компонування з використанням неявного зв’язування.