Delphi o'rnatilganda har soatda DLL fayllar qanday ko'chiriladi. Delphida dinamik kutubxonalarning (DLL) ushbu variantini yaratish. Singing DLL funksiyalarini ko'rib chiqish

Golovna / Kontaktlar

DLL- Dynamic Link Library yoki dinamik ravishda ulanadigan kutubxona, chunki u turli dasturlarda bitta va bir xil funksiyalarni muzlatish imkonini beradi. Bir hovuch, eng muhimi, kutubxona yozilgandan so'ng, uni boy dasturlarda yozish mumkinligi haqiqatdir. Bugungi darsda biz mashq qilishni o'rganamiz dll va, albatta, ularni yarating!
Xo'sh, qilaylik!

Keling, Persha Dinamik havola kutubxonamizni yarataylik! Virusaemo Delphi Va u darhol Fayl -> Yangi -> Boshqa menyusida mavjud.
Bizning oldimizda oxirida xuddi shu o'q bor:

Dynamic-Link Library ro'yxatidan tanlangan (2009 yilgi versiyalar uchun Delphi element DLL ustasi deb ataladi).

Natijada, bizda kodli oynadan kamroq, bizda mavjud bo'lmagan shaklni hurmat qiling!
Hozir naytsíkavíshe ta'mirlanmoqda. Keling, kutubxonadagi birinchi protseduralarimizni yozaylik.

kutubxona loyihasi 2;
// Siz, yakka-yakka, dastur almashtirilganini esladingiz
//Dll yaratilganda kutubxona so'zi chaqiriladi.
// Kutubxona nimani anglatadi.
foydalanadi
Sysutils, dialoglar,
sinflar; // Hurmat! Modullarni belgilashni unutmang,
// aks holda kod qayta ishlanmaydi

($R*.res)
(QIU CHASTIN DLL kodiga ega)

Birinchi protsedura chaqiruvi; stdcall; eksport;
//Stdcall - Qaysi operatorning parametrlari stekga joylashtirilgan
// chapdan o'ngga va standart qiymatga teskari
//Prinsip bo'yicha eksport o'tkazib yuborilishi mumkin, aniqlik uchun
//eksport tartibi va funksiyasi.

Boshlanishi
ShowMessage(" dll-dagi birinchi protseduram");

oxiri;

DoubleProcedureCall; stdcall; eksport;
Boshlanishi
ShowMessage(" Do'stim protsedurasi");
// Ekranga bosing
oxiri;

FirstCall, DoubleCall eksport qiladi;
//Eksport qilingan elementlar ro'yxati Eksportda saqlanadi.
// Qanday qilib dastur sifatida import qilinadi.

boshlanishi
oxiri.

Tsomu mi kuni, biz hali ham sho zupinimsya chunki oddiy dumba uchun, bu etarli bo'ladi. Biz darhol loyihamizni saqlaymiz, ayniqsa uni Project2.dll nomi bilan saqlaymiz va kutubxonani kompilyatsiya qilish uchun CTRL+F9 tugmalar birikmasini bosing. Papa, dpr faylni qayerda saqladingiz faylda aybdor degan ko'rinadi dll kengaytmasi, tsya i ê kutubxonamiz yaxshi yaratilgan. Menda Project2.dll deb nomlangan

Endi kutubxonaning protseduralar tsikli bilan shug'ullanamiz. Biz standart sxema ortida yangi dastur yaratamiz. Bizning oldimizda g'ayrioddiy narsa yo'q, shunchaki shakl. Yangi qo'shimchani Yakus jildiga olib boring. I qiu w papkasida men uni ko'chirib olaman dll kutubxonasi. Tobto. ichida bu dumba Project2.dll

Endi siz kutubxonaning funksiyalarini qanday chaqirishni tanlashingiz kerak. Biz ikkita usuldan va viklikudan foydalanamiz.

№1 usul
Kutubxonada mavjud protseduralarni eslab qolishning eng oddiy usuli bo'lishi mumkin.
Bu faqat bitta kutubxonasi bo'lgan ishchi uchun ideal.

Xo'sh, ketaylik ...
Amalga oshirish kalit so'zidan keyin keyingi kod yoziladi:

Birinchi protsedura chaqiruvi; stdcall; tashqi "Project2.dll";
// Replace Project2.dll kutubxona nomi bo'lishi mumkin

DoubleProcedureCall; stdcall; tashqi "Project2.dll";

Bu erda, siz allaqachon taxmin qilganingizdek, biz dasturga protseduralarimizni nomlashni va yoqimsiz hid borligini aytishni eslatamiz. dll kutubxonasi mening fikrimcha Project2.dll nomi bilan

Endi ushbu protseduralarni chaqirish uchun biz kodning darhol nomlashimiz mumkin bo'lgan joyiga ularning nomlarini kiritishimiz kerak. Biz standart yorlig'idan shaklga 2 ta tugma komponentlarini joylashtiramiz va OnClick ostida teri namunasini yaratamiz.

Birinchi tugmani bosish:


Boshlanishi
birinchi qo'ng'iroq;
oxiri;

Boshqa tugmani bosing:


Boshlanishi
ikki tomonlama qo'ng'iroq; // Men DLL-da bo'lish kabi protseduraman
oxiri;

Hammadan mendan!

2-usul:
Katlama birinchi navbatda pastroq bo'ladi, lekin uning afzalliklari bor va plaginlar uchun juda mos keladi.
Zastosuvannya uchun berilgan usul, biz global o'zgarishlarning bir qismidan kar bo'lamiz:

Var
LibHandle: HModule; //Kutubxona moduliga yuborish
Birinchi qo'ng'iroq: protsedura; stdcall;
//Kutubxonadagi protseduralarimizning nomlari.

DoubleCall: protsedura; stdcall;

Keyin, amalga oshirish kalit so'zidan keyin biz kutubxonamizni egallash uchun protsedura yozamiz:

Load ProcedureMyLibrary(FaylNomi: String);
Boshlanishi
LibHandle := LoadLibrary(PWideChar(FileName));
//Kutubxonani oling!
// Hurmat! 2009 Delphi dan past versiyalar uchun PChar
Agar LibHandle = 0 bo'lsa, boshlang
MessageBox(0,"",0,0);
Chiqish;
oxiri;
FirstCall:= GetProcAddress(LibHandle,"FirstCall");
//Ob'ektda Otrimuyom pokazhchik
// Kutubxona moduliga yuborilgan birinchi parametr
//dll-dagi ob'ekt nomining 2-parametri

DoubleCall:= GetProcAddress(LibHandle, "DoubleCall");
Agar @FirstCall = nil bo'lsa, boshlang

MessageBox(0," Kutubxonani egallab olish mumkin emas",0,0);
Chiqish;
oxiri;
Agar @DoubleCall = nil bo'lsa, boshlang
// Ushbu funktsiyaning kutubxonada mavjudligini qayta ko'rib chiqish.
MessageBox(0," Kutubxonani egallab olish mumkin emas",0,0);
Chiqish;
oxiri; oxiri;

Agar formada biror narsa yaratilgan bo'lsa, OnCreate podining namunasi, unda yaxshi yaratilgan protsedura yordami uchun bizning kutubxona

Protsedura TForm1.FormCreate(Sender: TObject);
Boshlanishi
LoadMyLibrary("Project2.dll");
oxiri;

Endi yana kutubxonamizdan kerakli protseduralarni olish uchun kod joyiga ularning nomlarini kiritish kifoya. Buning uchun biz "Standart" yorlig'idan shaklga "Tugma" ning 2 ta komponentini tashlab, uni OnClick ostida teri namunasida yaratishimiz mumkin.

Birinchi tugmani bosish:

Protsedura TForm1.Button1Click(Sender: TObject);
Boshlanishi
birinchi qo'ng'iroq; // Men DLL-da bo'lish kabi protseduraman
oxiri;

Boshqa tugmani bosing:

Protsedura TForm1.Button2Click(Sender: TObject);
Boshlanishi
ikki tomonlama qo'ng'iroq; // Men DLL-da bo'lish kabi protseduraman
oxiri;

Xo'sh, biz OnDestroy nusxasini shaklda, o'ziga xos hayotda yaratmoqdamiz dll kutubxonasi xotiradan

Protsedura TForm1.FormDestroy(Sender: TObject);
Boshlanishi
FreeLibrary (LibHandle);
//Xotira kutubxonasiga qarash.
oxiri;

Hammadan mendan! Kutubxonada to'plangan aniqlangan ob'ektda noqulay, lekin ayni paytda ortiqcha yozishning yana bir usuli.

P.S. Saytda oldindan qaror qabul qilishni va Delphi bo'yicha yangi video darslarni, audio podkastlarni, maqolalarni olishni xohlaysizmi.
Musobaqalarda qatnashing va bosqichma-bosqich jamoamizga qo'shiling?!
To'g'ridan-to'g'ri saytga bepul multimedia obunasiga obuna bo'ling
Biz allaqachon 3500 dan ortiqmiz!

Delphidagi DLL varianti
  • DLL tushunchasi
  • Delphi DLL yaratish (eksport)
  • Delphi DLL wiki (import)
  • Ma'lumotlar bilan ishlash uchun VCL ob'ektlarini buzadigan DLL
  • DLL-dagi vaziyatlarni ayblash
  • DLL tushunchasi

Keling, DOS da dasturlash jarayonini aniqlaymiz. Dasturning chiqish matnini mashina kodiga aylantirish, shu jumladan ikkita jarayon - kompilyatsiya va bog'lash. Ulanish jarayonida havolalar muharriri tuziladi Okremí modullari dastur kodini ochiq funksiya va protseduralar va yangi kod sifatida joylashtirish orqali dasturlar. Siz bitta dasturni shu tarzda tayyorladingiz, ikkinchisini, uchinchisini ... Men jim funksiyalarning kodini o'zlari qirib tashladim va ularni yana dasturga joylashtirdim.

Program1 Program2: : MyFunc(:) MyFunc(:) : : funktsiya kodi MyFunc funktsiya kodi MyFunc boshqa funktsiya kodi boshqa funktsiya kodi

Boy topshiriqli o'rta dasturda bunday pídkhíd bív kamroq beparvolik bor, oskílki bu funktsiyalarning o'zi soni ulug'vor, promalovuvannya elementív ínterfejsí koristuvach interfeysi uchun vidpovídalnyh, tizim resurslariga kirish uchun va hokazo. dublikat b povnistyu umuman qo'shimchalar, bu shvedlarning eng qimmat resurs - operativ xotiradan foydalanishiga olib keladi. Dinamik bog'lanish tushunchasi UNIX-ga o'xshash platformalarda xuddi Vinil kabi muammoning kulminatsion nuqtasi sifatida targ'ib qilingan (2-rasm).

Lekin nima uchun Dynamic Link Library (DLL) ajoyib qo'shimchalarga o'xshaydi? Buni tushunish uchun vazifa (topshiriq), dastur (instansiya) va modul (modul) misoli (nusxasi) tushunchasini aniqlashtirish kerak.

Bitta dasturning bir nechta misollarini ishga tushirganingizda, Windows zavantazhu operativ xotira kod va resurslarning faqat bir nusxasi - qo'shimcha moduli, ma'lumotlarning okremyh segmentlari ro'yxatini yaratish, stek va qo'llab-quvvatlash liniyalari (bo'lim. 3-rasm), rozumíny yilda terilari vazifalar to'plamidir. Windows. Dastur nusxasi dastur moduli joylashgan kontekstdir.

DLL - kutubxona ham modul hisoblanadi. U bitta nusxada xotirada saqlanadi va ushbu resursning kod segmentini, shuningdek, ma'lumotlar segmentini almashtiradi (bo'lim. 4-rasm).

DLL - Kutubxona DLL-ga joylashtirilgan funksiyalar stek tomonidan chaqiriladigan dastur kontekstida joylashtiriladi. Ale t í níkííí í̈ vykoristovuyut segmenti danih scho nabíbrítetsí, kopiíí dasturi emas.

Bunday tashkilot tufayli DLL hamma narsa hisob uchun xotirani saqlashi mumkin ishlaydigan dasturlar bitta DLL modulini buzish, ularning hammasini o'z ichiga olmaydi standart funktsiyalar ularning modullari omboriga.

Ko'pincha, DLL sifatida, bir xil yoki boshqa mantiqiy belgilar uchun birlashtirilgan funktsiyalar to'plami mavjud bo'lib, ular Paskalda modullarning kontseptual tarzda rejalashtirilishiga o'xshaydi (sezish birligi uchun). Farqi shundaki, Paskal modullarining funktsiyalari statik ravishda - bog'lanish bosqichida va DLL-larning funktsiyalari dinamik ravishda, ya'ni ish vaqtida bog'lanadi.

Delphi DLL yaratish (eksport)

Delphi DLL ni dasturlash uchun sizga seriya kerak kalit so'zlar sintaksisni boshqargan. Golovna - Delphi ning DLL dasturi o'zi shunday loyihadir.

Keling, DLL shablonini ko'rib chiqaylik:


Bunday shablon uchun loyiha fayli MYDLL.DPR bo'lishi mumkin.

Afsuski, Delphi IDE avtomatik ravishda dastur loyihasini yaratmaydi, shuning uchun siz DLL loyihasini qo'lda tayyorlashingiz kerak. Delphi 2.0 da shaffoflik olib tashlandi.

Dasturda bo'lgani kabi, DLL ê split-da ham qo'llaniladi. Boshlang'ich qismi obov'yazkovaya emas. Eksportni taqsimlashda funktsiyalar qayta tartibga solinadi, unga kirish vykonuvatisya yz zvnyshnyh dadatkív uchun ayblanadi.

Funksiyalarni (va protseduralarni) eksport qilish bir necha usullar bilan amalga oshirilishi mumkin:

  • raqam bo'yicha (indeks)
  • nomi bilan

Quyidagi yo'l bilan boshqa sintaksis mavjud:


Windows DLL ning "rezident funktsiyalari" ni tushunganligi sababli, xotirada uzoq vaqt davomida ma'lum bo'lgan ushbu funktsiyalar xotirada DLL bazasiga ega bo'lishi uchun Delphida bunday eksportni tashkil qilish uchun vositalar mavjud:


keyin eksport qilinadigan funksiyalarning indekslanishi Delphi tomonidan avtomatik ravishda buziladi va bunday eksport funksiya nomi bo'yicha tartiblangan nom bo'yicha eksport sifatida ko'rib chiqiladi. Biroq, dasturdagi ovozli import qilingan funktsiyalar DLL-dagi ovozsiz funktsiyalardan ta'sirlanishi mumkin. Import qilingan funksiyalarga allaqachon o'rnatilgan direktivlarga kelsak, biz ular haqida quyida gaplashamiz.

Delphi DLL wiki (import)

Importni tashkil etish uchun, tobto. funktsiyalarga kirish, DLL-larni eksport qilish va eksport qilish, Delphi standart xarajatlarni ta'minlaydi.

Ko'proq ilovalar uchun dasturingiz DLL dan import qilingan funktsiyalarni quyidagi tartibda ko'rsatishi kerak:


Ushbu usul statik import deb ataladi.

Esingizda bo'lsa, DLL uchun qasos olish uchun faylning kengaytmasi ko'rsatilmagan - reklama uchun *.DLL va *.EXE fayllari o'ralgan. Agar shunday bo'lsa, faylni yanada kengaytirish mumkinligini (masalan, Delphi'dagi COMPLIB.DCL kabi) yoki dinamik ravishda DLL va import funktsiyalarini belgilashingiz kerakligini bilishingiz kerak (masalan, dasturingiz turli xil fayllar bilan ishlaydi. grafik formatlar va teri uchun z ularni ísnuê okrema DLL.)?

Bunday muammolarni hal qilish uchun siz dinamik importni chaqirib, to'g'ridan-to'g'ri Windows API-ga o'tishingiz mumkin:


foydalanadi WinTypes, WinProcs, ...; turi TMyProc = tartib ; var Tutqich: THandle; MyImportProc: TMyProc; boshlanishi Tutqich:= LoadLibrary("MYDLL"); agar Tutqich >= 32 keyin (agar boshlanishi@MyImportProc:= GetProcAddress(tutqich, "MYEXPORTPROC"); agar MyImportProc nol keyin ... (import qilingan protsedura yordamida) oxiri; FreeLibrary (tutqich); oxiri;

Eksport/importni kar qilish, DLLdan chiqish nuqtasini o'zgartirish va boshqa ilovalar uchun sintaksis diagrammalari. 21 kun".

Agar siz kompilyator tomonidan yaratilgan kod haqida gapirmasangiz (bir vaqtning o'zida ko'proq optimallashtirishlar mavjud), unda barcha sintaksis qoidalari Borland Pascal 7.0 da bo'lgani kabi yo'qolgan.

Ma'lumotlar bilan ishlash uchun VCL ob'ektlarini buzadigan DLL

O'zingizning dinamik kutubxonangizni yaratganingizda, boshqa DLL-lardan funktsiyalarni bog'lashingiz mumkin. Bunday DLL misoli Delphi tomonidan taqdim etilgan (X: DELPHI DEMOS BDEDLL). Tsya DLL o'rniga jadvallar va unga kirish uchun g'alabalar ma'lumotlarni ko'rsatadi, VCL ob'ektlari (TTable, TDBGrid, TSession), yak, o'z qatorida, BDE funktsiyalarini chaqirish. Qanday qilib boshimning pastki qismidagi sharhlarga baqirish mumkin, bunday DLL uchun obmezhennya bor: vv bir soatda bir dekílka zavdan yutib bo'lmaydi. E'tibor bering, JB moduli ulanganda avtomatik ravishda yaratiladigan Sessiya ob'ekti vazifa uchun emas, balki modul uchun ishga tushiriladi. Agar siz boshqa dastur bilan DLL ni olishga harakat qilsangiz, kechirim so'rang. pobebígannya bir soatlik zavantazhennu DLL kílkoma zavdannym uchun zdíysnit deakí díí̈ kerak. Bundan tashqari, boshqa vazifalar uchun qaysi DLL-lar tanlanganligini tekshirish tartibi mavjud.

DLL-dagi vaziyatlarni ayblash

Delphida yaratilgan DLL dagi nosoz holat barcha dasturlardagi nosozliklar oldiga keltirildi, shuning uchun DLL o'rtasida vaziyat umumlashtirilmadi. Buning uchun DLL-ni ishlab chiqish vaqtida barcha mumkin bo'lgan salbiy tomonlarni o'tkazish kerak. Import qilinayotgan tanlangan funksiyaning natijasini qatorga yoki i raqamiga qarash uchun aylantirishni tavsiya qilishingiz mumkin, agar kerak bo'lsa, dasturda aybdor vaziyatni qayta hisoblang.


funktsiyasi MyFunc: ip; boshlanishi harakat qilib ko'ring (Funksiya kodini tozalash) bundan mustasno yoqilgan ERNatija: Istisno qil Natija:=Format(DllErrorViewingTable, ) boshqa Natija:= Format(DllErrorViewingTable, ["Noma'lum xato"]); oxiri; oxiri;

Dastur kodi:


StrResult:= MyFunc; agar StrResult "" keyin oshirish Exception.Create(StrResult);

Stattya Delphidagi DLL varianti tarqatilgan Fayl tizimi DLL va plaginlardan Delphi va FreePascal sotuvchilari uchun foydalanish mumkin.

Qisqartirish DLL"dinamik ravishda harakatlanadigan kutubxona" degan ma'noni anglatadi. Delphida Dll tse fayli, kerakli ish uchun qasos olish uchun nima kompyuter dasturi protseduralar va funktsiyalar, ular bilan dastur vikonannya bosqichida to'xtaydi.

Agar barcha kerakli kichik dasturlarni dastur turida tasvirlash mumkin bo'lsa, yaxshi bo'ladi, buning uchun qo'shimcha dasturlarni yaratish kerak. dll fayli vikonannya bir soat u bilan zadnuvatisya deb? Ko'proq gnuchkost uchun robe yaratilgan dasturlar. Vaqt o'tishi bilan ba'zi ma'lumotlarni qayta ishlash algoritmlari o'zgarishi mumkin. Agar dasturlarda ishlov berish tartib-qoidalari bo'lsa, siz qayta kompilyatsiya qilishingiz va faylni almashtirishga qayta o'tkazishingiz kerak bo'ladi. Kichkina dll-faylni o'tkazing, bu bir nechta protseduralar bilan bajarilishi mumkin, u ancha sodda va avtomatik rejimda ishlaydi.

Bundan tashqari, robot kutubxona dll zovsym u yaratilgan bo'ladi, dastur tilida yolg'on emas. Shuning uchun, dasturimiz uchun dll yaratish uchinchi tomon chakana sotuvchilarga ishonib topshirilishi mumkin, bu dasturlash tili haqida o'ylamasdan, o'ziga yoqadi. Shubhasiz, tayyor loyihani yaratish va deputatlarga topshirishni tezlashtirish kerak

DLL yaratish

Delphida dll yaratish emas ko'proq katlama Qo'shimcha modul. Fayl -> Yangi -> -> Boshqa... buyrug'ini kiriting, paydo bo'lgan muloqot oynasida DLL Wisard belgisini tanlang. Natijada Delphi DLL kutubxona loyihasini yaratadi:

kutubxona loyiha 1;

(DLL xotira boshqaruvi haqida muhim eslatma: ShareMem bo'lishi kerak
kutubxonangizdagi birinchi birlik "USES bandi VA loyihangiz" ni tanlang (
Project-View Source) USES bandi, agar DLL biror protsedurani eksport qilsa yoki
satrlarni uzatuvchi funksiyalar parametrlar yoki natija funksiyalaridir. Bu
DLL ga va DLL dan o'tkazilgan barcha satrlarga, hattoki shularga ham tegishli
yozuvlar va sinflarga joylashtirilgan. ShareMem interfeys birligidir
birgalikda joylashtirilishi kerak bo'lgan BORLNDMM.DLL umumiy xotira menejeri
DLL bilan. BORLNDMM.DLL ni ajratib ko'rsatish uchun qator ma'lumotlarini o'tkazing
PChar yoki ShortString parametrlari. )

foydalanadi
sisutillar,
sinflar;

($R*.res)

boshlanishi
oxiri
.

Yangi dll kutubxonasi uchun nom tanlang va buyruqni kiritish orqali uni okrem papkasida saqlang fayl -> Saqlash... Paplarda 4 ta fayl bor, o'rta dll fayli bo'lmaydi. Oddiy eshitiladi matnli fayllar, loyiha tavsifi bilan nima qilish kerak dll kutubxonasining pastki sumka faylini yaratish uchun loyihani kompilyatsiya qilish kerak. Jamoani buz loyiha -> Loyihani kompilyatsiya qilish. Natijada, bizning papkada dll-fayl paydo bo'ladi va asosiy dastur yuklanadi.

Kutubxona hali ham bo'sh.

...hozir tahrir bosqichida...



Kirish

Dasturlash texnologiyalarining notinch rivojlanishi bilan bog'liq holda, tobora ko'proq odamlar o'z dasturlari imkoniyatlarini oshirish muammosi bilan kurashmoqda. Ushbu maqola kuchning o'ziga va o'ziga - Borland Delphi-dan DLL-ni dasturlashga bag'ishlangan. Bundan tashqari, mening torknemosya ozuqa parchalari yaxshi vikoristannya DLL, keyin boshqa odamlarning DLL-laridan (jumladan, WinAPI kabi tizimli) funktsiyalarni import qilish muhimdir.

DLL tiqilib qolgan joylar

Otzhe, endi biz DLL kutubxonalari kerak va de vikoristovuyutsya hid?

Okremí kutubxonalari dasturchilar uchun místya korisny qo'shimcha funktsiyalar. Masalan, qatorlarda ishlash funktsiyalari yoki tasvirlarni o'zgartirish uchun yig'iladigan kutubxonalar. Resurs Treasures DLL-lari dastur funktsiyalari sifatida ishlatilishi mumkin va turli xil manbalar - piktogrammalar, kichiklar, qatorlar massivlari, menyular va boshqalar. Qo'llab-quvvatlash kutubxonalari Misol tariqasida, siz DirectX, ICQAPI (ICQ uchun API), OpenGL kabi paketlarning kutubxonalarini qo'shishingiz mumkin. Dasturning qismlari Masalan, DLL dan dastur oynalarini (forma) ham saqlashingiz mumkin. Plaginlar Plaginlar - bu ularning imkoniyatlarini kengaytiruvchi dasturlarga qo'shimchalar. Misol uchun, ushbu maqolalarda biz dastur uchun plaginni yaratish nazariyasini ko'rib chiqishimiz mumkin. Resurs DLL (Dynamic Link Library) dasturlar yoki jarayonlar tomonidan imkon qadar tez-tez baham ko'rilishi mumkin (almashish deb ataladigan - umumiy manba)

Robot DLL uchun funktsiyalar va ilovalarning qisqacha tavsifi

Xo'sh, bu funktsiyani qanday qabul qilasiz? Keling, kutubxonadan funktsiyalarni import qilishning ikkita usulini ko'rib chiqaylik:

1 yo'l DLL-ni dasturga ulash.

DLL dan import qilingan funktsiyalarni topishning eng oddiy va eng oson usuli. Biroq (va ehtiyot bo'lish uchun) bu usul yanada vagom bo'lishi mumkin - kutubxona kabi, sehrgar dasturi kabi, agar topilmasa, dastur shunchaki boshlamaydi, kechirim so'radi va DLL-ni eslatadi. resurs topilmadi. Va bilish uchun kutubxonani qidiring: oqimli katalog, dasturiy ta'minot katalogi, WINDOWS\SYSTEM katalogi va boshqalar. Otzhe, boshoq uchun - men qabul qilaman shakli:


FunctionName (yoki ProcedureName) - funksiya (yoki protsedura) nomi, chunki u sizning dasturingizda aks ettiriladi; Par1, Par2, ... protsedura funksiyasidagi parametrlarning nomlari; Par1Type, Par2Type, ... protsedura funksiyasidagi parametrlar turi (masalan, Integer); Aylantirish uchun ReturnType qiymat turi (faqat funksiya); stdcall direktivasi, bu DLL-ning o'zida zbígatisya z vikoristovuvanoyning javobgarligi; mavjud DLL nomini belgilaydigan tashqi "DLLNAME.DLL" direktivasi, bu holda funksiya yoki protsedura import qilinadi (da ushbu maxsus turga- DLLNAME.DLL); name "FunctionName" ("ProcedureName") direktivasi, DLL-ning o'zida funksiya nomini aniq belgilaydi. Bu neobov'yazkova direktivasi, chunki u men nomlashim mumkin bo'lgan dastur funktsiyasida g'alaba qozonish imkonini beradi vídmínnu víd ítínnoí (yak menda kutubxona bo'lmaydi); index FunctionIndex (ProcedureIndex) direktivasi, DLL dagi funksiya yoki protseduraning tartib raqamini belgilaydi. Tse ham neobov'yazkova direktivasi.

Bu boy katlanmış, ale va oqlangan usul. Vín birinchi usulga imtiyozlar. Qabul qilib bo'lmaydigan yagona narsa - bu qabul qilishni amalga oshirish uchun zarur bo'lgan kod va DLL-dan import qilinadigan funktsiya faqat DLL ushlangan va xotirada ma'lum bo'lganidan keyin foydalanish mumkin bo'lishining murakkabligi ... uzoq - qisqa Tasvir WinAPI funksiyasi usulidan foydalangan holda cimslarni o'chirish:

LoadLibrary(LibFileName: PChar) xotiradan belgilangan LibFileName kutubxonasini oladi. Muvaffaqiyatli tugallangandan so'ng, funktsiya (THandle) DLL dastagini xotiraga aylantiradi. GetProcAddress(Module: THandle; ProcName: PChar) eksport qilingan kutubxona funksiyasining manzilini o'qiydi. Funktsiya muvaffaqiyatli tugallangandan so'ng, funktsiyaning dastagini (TFarProc) DLL yozuvlariga aylantiring. FreeLibrary(LibModule: THandle) o'lik bo'lmagan LibModule bilan ishlaydi va uni eslab qolishimga ruxsat bering. Keyingi qadam, funktsiyadan keyin kutubxona protseduralari mavjud emasligini ko'rsatishdir.

Bu dumbani mashq qiling

Xo'sh, endi eng xilma-xil usullar va yondashuvlarning bir nechta misollarini keltirish vaqti keldi:

Misol 1. DLL ni dasturga ulash


Endi xuddi shunday, lekin boshqacha tarzda - dinamik manfaatlar bilan:


Eslatma:

Kutubxona funktsiyalarida satr turiga mos keladigan siljish, chunki qachon yoga vikoristanny ísnuyut muammolar z "rozpodyl xotira". Bu haqdagi hisobotni (haqiqiy, inglizcha) Delphi yaratayotgan DLL loyihasining bo'sh matnida o'qishingiz mumkin (Fayl -> Yangi -> DLL). Shunday qilib, PChar-ni tezda aylantiring va keyin uni StrPas string funktsiyasiga aylantiring.

Va endi DLL-ning o'zini ko'rib chiqaylik:

Hodisa 3. MYDLL.DPR loyihasiga havola


DLL resurslari va shakllarida joylashtirish

DLL funktsiyalari va kursorlar, kichiklar, piktogrammalar, menyular, matn qatorlari sifatida joylashtirilishi mumkin. Biz nima ekanligimiz haqida qichqirmaymiz. Men resurs DLL-ni qo'lga kiritishi kerakligini hurmat qilaman, deskriptorni olib tashlagan holda, resursning o'zini shunga o'xshash funktsiyaga ega bo'ling (LoadIcon, LoadCursor va boshqalar). Vicon dasturlarini DLL kutubxonalarida joylashtirishning bir qismidan ko'prog'ini tarqatganlar uchun (bu shakllar Delphida mavjud).

Kim uchun siz yangi DLL yaratishingiz va unga yangi shakl qo'shishingiz kerak (Fayl -> Yangi -> DLL, keyin esa - Fayl -> Yangi shakl). Shakl dialog oynasi kabi (modal shakl (bsDialog)), keyin uni DLL-ga qo'shing. kelish funktsiyasi(aytaylik, forma Form1 deb ataladi, bu sinf TForm1):

Misol 4. DLL da shakllarni joylashtirish


DLL ga modal bo'lmagan shakl qo'shish uchun ikkita funktsiyani qo'shish kerak - formalarni ochish va yopish. DLL-ni o'zgartirishingiz kerak bo'lganda, shakl dastagini eslang.

Plaginlarni yaratish

Bu erda biz plaginlarni batafsil ko'rib chiqamiz, chunki Uni ko'rsatish sizga DLL dasturlashning chap tomoniga osongina o'tishga yordam beradi. O'ylaymanki, plagin o'z imkoniyatlarini kengaytiradigan dasturga qo'shimcha hisoblanadi. Bunday holda, dasturning o'zi bunday qo'shimchalar mavjudligini obov'yazkovo o'tkazishi va ularga o'z e'tirofini vikonuvat qilishiga imkon berishi mumkin.

Tobto, masalan, oldin plagin yaratish uchun grafik muharriri, tasvirni o'zgartirgandan so'ng, siz plaginda kamida ikkita funktsiyani o'tkazishingiz kerak bo'ladi (i, dasturdagi funktsiyalarni ikki marta bosing) - b im'ya plaginini aylantirgan funktsiya (i/yoki io ​​turi). ), ushbu plaginni menyuga (yoki asboblar panelida) qo'shish uchun, ortiqcha asosiy funksiyasi- tasvirni uzatish va qabul qilish. Tobto. Dastur boshidanoq plaginni qidiradi, so'ngra topilgan terini topadi, u qat'iy nomlangan nomlardan funktsiyani chaqiradi (masalan, GetPluginName) va menyudan kerakli elementni qo'shadi, keyin esa, aslida. , ushbu elementni tanlash orqali - funksiyani do'stingizga chaqirish, go'yo "Men faylman, tasvir uchun qasos olish kerak) va bu funksiya o'ziga xos tarzda tasvirni o'zgartiradi va uni yangi ko'rinishda aylantiradi ( aks holda, bu yangi rasmga ega fayl). Eksa va plaginning butun mohiyati...

Epilog

Ushbu maqolada Borland Delphi-dan DLL kutubxonalarini tanlashning asosiy jihatlari ko'rsatilgan. Agar sizda ovqat bo'lsa, uni menga elektron pochta orqali yuboring:

O'rtada Delphi dasturlash DLL kutubxonalarini shvedcha yaratish uchun kutubxonaga o'tkazish.

Funktsiyadan qasos olish uchun qo'shiq aytish uchun kutubxona yarataylik

GetArea(a, b, c: REAL): REAL.

Ushbu funktsiya bilan tricutnikning ikki tomoni kiraverishda xizmat qiladi. Funktsiya berilgan trikotaj maydonini aylantiradi:

p:=(a+b+c)/2;

Natija:=SQRT(p*(p-a)*(p-b)*(p-c))

Boshlash Delfi, lekin masofa noan'anaviy edi. F menyu bandini tanlangbilanNewOu erda, oxirida N xatcho'pida nima yozilganewDLL W belgisini bosingizard. ( versiyada depozit qilish algoritmi)

DLL-kutubxonani tayyorlash fayli kimda yaratiladi. Vín allaqachon eng katta modulga o'xshaydi (birlik)Delfi, faqat operatorga bog'liqKutubxona. Buning uchun loyihani saqlang, chunki kelajakda biz DLL-kutubxonani olamiz, aytaylik,GetA. IsmGetAreag'alaba qozonish mumkin emas - u allaqachon ular tomonidan ishg'ol qilingan funktsiyalar.

Endi operatordan keyinFOYDALANISHbiz funktsiyamiz matnini yozamiz, lekin sarlavhada ba'zi o'zgarishlar bilan:

FUNCTION GetArea(a, b, c:REAL):REAL;eksport;

EXPORT kalit so'zi ushbu funksiya eksport qilinganligini va mavjud dasturlardan ko'rinib turishini bildiradi.

Funktsiya matni berilganidan keyin

GetArea;

EXPORTS bayonotida barcha protseduralar va funksiyalar kutubxonadan eksport qilingani uchun sotib olinadi. Bu kutubxonamizning o'ziga xos katalogidir.

Vikonannya-da kutubxonani ishga tushirishning iloji yo'q, siz uni faqat tuzishingiz mumkin. Qaysi biri uchun biz loyiha → Build menyu bandini tanlashimiz mumkin. Hamma narsa to'g'ri ishlab chiqarilgandan so'ng, oqim katalog diskida geta.dll nomli fayl yaratiladi. Bu bizning kutubxonamiz.

Hurmatli hurmat Eslatma: kutubxonadagi protseduralar va funktsiyalarni, STRING tipidagi parametrlarni o'tkazishda foydali noziklik.

Parametrlarni STRING turiga, USES bayonotlari va kutubxonalarida va uni chaqiradigan dasturlarda o'tkazish imkoniyatiga ega bo'lish uchun, modul ro'yxatda birinchi bo'lishi uchun tilni sudrab, ShareMem modulining ulanishini yozing. Bundan tashqari, bir vaqtning o'zida kutubxona borlndmm.dll faylini qo'shishi kerak bo'ladi (Delphi yetkazib berish tarkibiga kiritilgan). Bunday vaziyatdan qochish oson: matn turi parametrlariga rioya qilib, ShortString ma'lumotlar turini (asosiy satr yoki 255 belgigacha) va PCharni (matn qatori uchun indikator) tanlang.

Viklik dll

DLL dan protsedura va funksiyalarni chaqirishning ikkita usulini tushuntiring. Birinchi navbatda, biz juda ortda qoldik, dasturni ishlab chiqish bosqichida biz DLL ni unga ulashimizni bilamiz (asosan biz o'zimiz va DLL ni yaratamiz). Boshqa yo'l bilan biz juda katta kutubxonaga, shu jumladan "xorijiy" kutubxonaga ulanamiz.

Statik qo'ng'iroq

Birinchi usulni amalga oshirish uchun chaqiriladi statik qo'ng'iroqlar, yangi standart dastur yarating, formada uchta kiritish maydonini LabeledEdit1…LabeledEdit3, tugma va Tlabel komponentini joylashtiring. IMPLEMENTATION bayonotidan so'ng geta.dll kutubxonasidan GetArea funksiyasini import qilishni ta'minlash uchun qator qo'shing:

GetArea funksiyasi(a, b, c: real): REAL; FAR; tashqi "Geta";

EXTERNAL so'zi funktsiya tanasi kutubxonada va tayinlangan nomlarda bo'lishi mumkin bo'lganlarni bildiradi va FAR so'zi zastosuvannya "ikki" chotibayte manzilini belgilaydi, bu zarur bo'lgan dasturning ekranlari, bo'lishi kerak. xuddi shu tomonda topilgan, kutubxona - ingliz tilida. Shubhasiz, geta.dll fayli oqim dasturining barcha fayllari joylashgan katalogga joylashtirilishi kerak.

Bosish tugmasi massiv yaratishi va uni kutubxona funktsiyasiga o'tkazishi va natijani ekranda ko'rsatishi kerak:

protsedurasi TForm1.Button1Click(Sender: TObject);

© 2022 androidas.ru - Android haqida hamma narsa