- •Анотація
- •1 Аналіз індивідуального завдання
- •2 Загальна структура програми
- •3 Розробка меню
- •4 Підключення панелі інструментів та рядку стану
- •4.1 Створення панелі інструментів
- •5.2 Створення діалогу для введення змінних
- •4.2 Створення рядку стану
- •5 Створення діалогових вікон
- •5.1 Основні етапи створення діалогу
- •6 Математичне обчислення
- •6.1 Мова assembler під Win32
- •6.2 Реалізація
- •7 Створення та підключення бібліотеки dll
- •8 Робота з файлами
- •8.1 Відкриття файлу
- •8.2 Збереження файлу
- •9 Керівництво системного програміста
- •10 Керівництво оператора
- •Висновки
- •Література
- •Додатки Додаток а
- •Додаток б
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 – Вміст файла
