Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPZ_13V_Мое.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
634 Кб
Скачать
☆

7 Створення та підключення бібліотеки dll

Бібліотеки DLL – це програмний код або дані, які динамічно доступні всім процесам операційної системи[5].

Стандартним розширення ім’я бібліотеки вважається .dll, якщо не вказувати інше. Так як в імені файлу вказано лише його назву, то цей файл повинен знаходитись в одному каталозі з основним файлом типу *.exe.

Динамічне завантаження DLL дозволяє програмі визначити, яка з бібліотек і коли буде завантажуватись, а також задати дію при невдалому завантаженні бібліотеки. Спочатку необхідно помістити модуль бібліотеки в пам’ять процесу. Дана операція виконується за допомогою функції LoadLibrary(), що має один аргумент – ім'я завантажуваного модуля.

HINSTANCE hDll;

hDll=::LoadLibrary("asmdll");

Для визначення адрес окремих функцій всередині бібліотеки використовується функція GetProcAddress():

FUN func;

func=(FUN)::GetProcAddress(hDll, "calc");

Для вивантаження бібліотеки з пам'ятті процесу використовується функція FreeLibrary().

Для створення самої бібліотеки DLL був створений новий проект типу Win32 Dynamic-Link Library та вибраний перемикач Simply DLL.

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

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

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

float calc (int x, int a, int b, int c)

Слід записати, що буде повернуто до основної програми:

…

return res;

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

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

LIBRARY " asmdll"

EXPORTS

calc @1.

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

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

Лістинг бібліотеки наведено в Додатку Б.

8 Робота з файлами

8.1 Відкриття файлу

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

Для відкриття файлу використовується конструктор класу:

CFileDialog DlgOpen(TRUE,(LPSTR)"*",NULL,OFN_HIDEREADONLY,(LPSTR) "All Files(*.*)|*.*||");

8.2 Збереження файлу

Причому, якщо змінити TRUE на FALSE, то отримається конструктор класу для збереження файлу:

CFileDialog DlgSaveAs(FALSE,(LPSTR)"txt",NULL,OFN_CREATEPROMPT| OFN_OVERWRITEPROMPT,(LPSTR)"Text Files(*.txt)|*.txt||");

де OFN_HIDEREADONLY – скриває прапорець Read-Only;

OFN_CREATEPROMPT – допускає створення неіснуючих файлів;

Для створення об’єкта Windows потрібно використати метод DoModal з наступним прототипом:

virtual int DoModal();

Цей метод повертає значення IDOK або IDCANCEL, в залежності від того, які кнопки були натиснуті при закриті діалогового вікна[4].

Для запису даних використовується наступна конструкція:

CStdioFile file(DlgSaveAs.GetPathName(),

CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);

Функція GetPathName()повертає ім’я вибраного файла та шлях. modeWrite– довзоляє створювати файл на запис.

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

file.WriteString(s);

Закриття файлу здійснюється за допомого такої функції:

file.Close();

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

CFile::modeRead|CFile::typeBinary);

Для виведення данних відкриваємого файлу використаємо окреме діалогове вікно(рис. 4). Дані будемо записувати в текстове поле Edit1.

Рисунок 4 – Вміст файла

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