Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.DOC
Скачиваний:
7
Добавлен:
16.05.2015
Размер:
662.02 Кб
Скачать

4.8.2 Створення власної бібліотеки dll

Для створення власної бібліотеки DLLспочатку необхідно створити відповідний проект таким чином.

Рисунок 4.2 - Діалогове вікноNew

  1. В головному меню вибрати пункт File, задати командуNew..., а в діалоговому вікніNew, яке відкриється, вибрати вкладкуProjects(Як правило, ця вкладка спочатку завжди відкрита) (рис.4.2).

  2. В цьому діалоговому вікні необхідно задати такі параметри:

  • в полі Locationвказати адресу робочої папки проекту, наприклад “D:\VisualC++\Dll”;

  • в полі Project nameзадати ім’я проекту, наприкладMyDll;

  • в списку типів проекту вибрати тип Win32 Dynamic-Link Library;

  • натиснути кнопку Create new workspace;

  • вибрати платформу, для якої створюється проект: Win32.

- закрити діалогове вікноNew.

  1. В діалоговому вікні Win32 Dynamic-Link Library, що відкриється (рис.4.3), вибрати кнопку-перемикачSimply DLL (проста бібліотекаDLL) і натиснути кнопкуFinish.

В результаті буде створено файл, який містить спеціальну функцію DllMain(), яка є одночасно і функцією входу, і функцією виходу (будемо її надалі називати функцією входу):

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved )

{

return TRUE; } .

За допомогою функції входу можна виконати ініціалізацію та завершальні роботи після закінчення роботи з бібліотекою DLL.

Рисунок 4.3 - Діалогове вікно Win32 Dynamic-Link Library

Другий параметр функції входу може мати одне із таких значень:

DLL_PROCESS_ATTACH– означає, що функція викликана процесом як вхідна;

DLL_PROCESS_DETACH– означає, що функція викликана процесом як вихідна;

DLL_THREAD_ATTACH– означає, що функція викликана потоком як вхідна;

DLL_THREAD_DETACH– означає, що функція викликана потоком як вихідна;

Далі у файлі бібліотеки DLLповинна бути описана саме та функція, яка власне і викликається процесами чи потоками. Така функція називається експортованою.

Якщо, наприклад, експортована функція ( назвемо її Calculate() ) має визначати суму елементів одновимірного масиву, тоді їй необхідно передати два параметри: адресу масиву і розмір масиву. Після виконання функція має повернути обчислену суму. Таким чином у файлі бібліотекиDLLнеобхідно записати:

int Calculate(int *ptr, int n)

{

int result=0;

int i,*mas;

mas=ptr;

for(i=0; i<n; i++)

result=result+mas[i];

return result;

} .

Досить часто експортовані функції використовують підпрограми мовою Асемблера. В цьому випадку мовою Асемблера, як правило, програмується обчислювальна операція, час виконання якої має бути мінімальним. А операції введення-виведення, які важко реалізуються мовою Асемблера, програмуються мовою високого рівня, вже за межами експортованої функції. Варто відмітити, що такий варіант використання Асемблера з практичної точки зору є найкращим.

Створимо експортовану функцію, що визначає суму елементів одно-вимірного масиву, але вже мовою Асемблера.

int Calculate(int *ptr, int n)

{

int result;

int address = (int)ptr;

int four = 4;

_asm{

mov ebx,address

mov ecx,n

mov eax,0

M1: add eax,[ebx]

add ebx,four

loop M1

mov result,eax

}

return result;

} .

Ім’я експортованої функції потрібно вказати в окремому файлі визначень (файл типу *.def). Створюється файл визначень таким чином.

  1. В головному меню вибрати пункт File, задати командуNew..., а в діалоговому вікніNew, яке відкриється, вибрати закладкуFiles.

  2. В цьому діалоговому вікні необхідно вказати такі параметри:

  • в полі Locationвказати адресу файлу;

  • в полі Nameвказати ім’я файлу, наприкладMyDll.def;

  • в списку типів файлів вибрати тип Text File;

  • встановити перемикач в положення Add to Project.

3. В текстовому редакторі набрати текст файлу визначень, наприклад:

LIBRARY "MyDll"

DESCRIPTION 'This library has one function'

EXPORTS

Calculate @1 .

У файлі визначень вказується ім’я експортованої функції та її номер, по якому функцію теж можна викликати.

Крім використання файлу визначень, існує ще один спосіб експорту функцій із бібліотеки DLL. Для цього потрібно визначити експортовану функцію в бібліотеціDLLяк глобальну:

extern “C” _declspec(dllexport);

Для остаточного завершення створення власної бібліотеки DLLнеобхідно виконати такі кроки.

1. В головному меню вибрати пункт Build, задати командуSet Active Configuration, а в діалоговому вікні, яке відкриється, вибрати ім’я файлу динамічної бібліотеки: MyDll.dll.

  1. Задати команду Rebuild.

В результаті буде створено папку Release, де буде знаходитись готовий до роботи файл динамічної бібліотеки MyDll.dll. Далі бажано перемістити отриманий файл у папкуDebug, де знаходиться основний виконувальний файл проекту - файл типуEXE.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]