|
Bajarilishi kerak bo'lgan vazifa
|
bet | 51/64 | Sana | 13.05.2024 | Hajmi | 183,36 Kb. | | #230077 |
Bog'liq Системное программирование, практикаBajarilishi kerak bo'lgan vazifa:
Oddiy DLL yuklash va tushirishni amalga oshiring .
Amalga oshirish tartibi:
DLL-ni dinamik ravishda yuklashda siz qilishingiz kerak bo'lgan birinchi narsa kutubxona modulini jarayon xotirasiga joylashtirishdir. Ushbu operatsiya funksiya yordamida amalga oshiriladi ::LoadLibrary , bu bitta argumentga ega - yuklanadigan modul nomi. Tegishli dastur fragmenti quyidagicha ko'rinishi kerak:
HINSTANCE hMyDll;
……
if((hMyDll=::LoadLibrary(“MyDLL”))==NULL) { /* DLL faylni yuklab boʻlmadi */ }
else { /* ilova hMyDll orqali DLL funksiyalaridan foydalanish huquqiga ega */ }
Agar siz boshqa kengaytmani ko'rsatmasangiz, Windows standart kutubxona fayl kengaytmasini .dll deb hisoblaydi. Agar fayl nomi ham yo'lni o'z ichiga olsa, u holda faylni qidirish uchun faqat shu yo'ldan foydalaniladi. Aks holda, Windows faylni xuddi exe fayli yuklangan katalogdan boshlab va PATH qiymatiga muvofiq davom etuvchi aniq kiritilgan DLL fayllari bilan bir xil tarzda qidiradi.
Windows faylni topganda, uning to'liq yo'li jarayon tomonidan allaqachon yuklangan DLL yo'li bilan taqqoslanadi. Agar identifikator topilsa, ilova nusxasini yuklab olish o'rniga, allaqachon kiritilgan kutubxonaga dastagi qaytariladi.
Agar fayl topilsa va kutubxona muvaffaqiyatli yuklangan bo'lsa, funktsiya ::LoadLibrary kutubxona funksiyalariga kirish uchun ishlatiladigan tutqichni qaytaradi.
Kutubxona funksiyalaridan foydalanishdan oldin ularning manzilini olishingiz kerak. Buning uchun birinchi navbatda direktivani ishlatishingiz kerak typedef funktsiya ko'rsatkichi turini aniqlash va ushbu yangi turdagi o'zgaruvchini aniqlash uchun, masalan:
// PFN_MyFunction turi funktsiyaga ko'rsatgichni e'lon qiladi,
// belgilar buferiga ko'rsatgichni qabul qilish va int qiymatini ishlab chiqarish
typedef int (WINAPI *PFN_MyFunction)(char *);
……
PFN_MyFunction pfnMyFunction;
Keyin siz kutubxona deskriptorini olishingiz kerak, uning yordamida siz funktsiyalarning manzillarini, masalan, nomli funktsiyaning manzilini aniqlashingiz mumkin. Mening funksiyam:
hMyDll=::LoadLibrary("MyDLL");
pfnMyFunction=(PFN_MyFunction)::GetProcAddress(hMyDll,"MyFunction");
……
int iCode=(*pfnMyFunction)("Salom");
Funktsiya manzili funksiya yordamida aniqlanadi ::GetProcAddress , unga kutubxona nomi va funksiya nomi o'tkazilishi kerak. Ikkinchisi DLL dan eksport qilinadigan shaklda uzatilishi kerak.
Funksiyaga u eksport qilinadigan tartib raqami orqali ham murojaat qilishingiz mumkin (bu holda kutubxona yaratish uchun def faylidan foydalanish kerak, bu haqda keyinroq muhokama qilinadi):
pfnMyFunction=(PFN_MyFunction)::GetProcAddress(hMyDll,
MAKEINTRESOURCE(1));
Dinamik havola kutubxonasi bilan ishlashni tugatgandan so'ng, uni funktsiya yordamida jarayon xotirasidan tushirish mumkin :: FreeLibrary :
::FreeLibrary(hMyDll);
|
| |