Delphi kurulduğunda tüm dll kütüphaneleri kopyalanır. Delphi'de dinamik kitaplıkların (DLL'ler) oluşturulması ve geliştirilmesi. Şarkı DLL fonksiyonlarının gözden geçirilmesi

Golovna / Kişiler

DLL- Aynı işlevleri farklı programlarda kolayca birleştirmenize olanak tanıyan Dinamik Bağlantı Kitaplığı veya dinamik olarak bağlanan bir kitaplık. Bu gerçekten iyi bir fikir, özellikle de kütüphane yazıldıktan sonra onu birçok programda kullanabileceğiniz için. Bugünkü dersimizde pratik yapmayı öğreneceğiz. dll Ve elbette onları yaratın!
İşte bu kadar!

Yeni başlayanlar için ilk Dinamik Bağlantı Kitaplığımızı oluşturalım! Virüs Delfi Dosya -> Yeni -> Diğer menüsünden hemen erişilebilir.
Sonunda eksen karşımıza çıkıyor:

Dinamik Bağlantı Kitaplığı listesinden seçim yapın (daha yeni sürümler için 2009) DelfiÖğeye DLL Sihirbazı adı verilir).

Sonuç olarak artık kod içeren bir penceremiz yok, lütfen burada sahip olmadığımız forma saygı gösterin!
Artık işler düzelmeye başlıyor. Kütüphaneciyle ilk prosedürlerimizi yazalım.

kütüphaneProje2;
//Siz melodik bir şekilde bir programın olduğunu zaten fark ettiniz
//Dll oluşturulduğunda word kütüphanesi eklenir.
/ / Kütüphane ne anlama geliyor?
kullanır
SysUtils, diyaloglar,
Sınıflar; // Saygı! Bu modülleri belirtmeyi unutmayın,
// aksi takdirde kod işlenmeyecektir

($R *.res)
(DLL KODU KISMEN VAR)

Prosedür İlk Çağrı; stdçağrı; ihracat;
//Stdcall - Bu operatörün parametreleri yığına yerleştirilir
// sağdan sola ve standart değerle hizalanmış
//Prensip olarak dışa aktarma ihmal edilebilir, açıklama için vikorist'i kullanın
//dışa aktarma prosedürleri ve işlevleri.

Başlamak
ShowMessage(" Dll'deki ilk prosedürüm");

Son;

Prosedür DoubleCall; stdçağrı; ihracat;
Başlamak
ShowMessage(" Arkadaşımın işlemi");
//Ekrandaki bir bildirime tıklayın
Son;

FirstCall, DoubleCall'ı dışa aktarır;
//Dışa Aktarma'da dışa aktarılan öğelerin bir listesi vardır.
// Hangi programların içe aktarıldığı.

başlamak
Son.

Na tsomu mi poki scho zupinimosya çünkü basit bir popo için bu tamamen yeterli olacaktır. Şimdi projemizi kaydediyoruz, özellikle ben Project2.dll ismiyle kaydettim ve CTRL+F9 tuşlarına basarak kütüphaneyi derledik. Baba, dpr dosyasını kaydettiğin yer, dosyayı şu adreste göstermekten sorumludur: dll uzantıları Bu bizim özenle oluşturulmuş kütüphanemizdir. Benim adım Project2.dll

Şimdi kütüphanenin prosedürlerine bakalım. Standart şemaya göre yeni bir program oluşturuyoruz. Önümüzde olağanüstü bir şey yok, sadece bir form. Yeni eklemeyi bu klasöre kaydediyoruz. Bu klasöre dikkatlice kopyalandım dll kütüphanesi. Tobto. V bu başvuru Proje2.dll

Artık kütüphane işlevlerine nasıl erişeceğinizi seçmelisiniz. Aramak için iki yöntem kullanıyoruz.

Yöntem No.1
Belki de bu, kütüphanedeki prosedürleri kullanmanın en basit yöntemidir.
Birden fazla kütüphaneyle çalışmak için idealdir.

İyi hadi gidelim...
Uygulama anahtar sözcüğünden sonra aşağıdaki kod yazılır:

Prosedür İlk Çağrı; stdçağrı; harici "Project2.dll";
// Project2.dll dosyasının değiştirilmesi kütüphanenin adı olabilir

Prosedür DoubleCall; stdçağrı; harici "Project2.dll";

Burada tahmin edebileceğiniz gibi programı, prosedürlerimizin adlarını ve görünüşe göre içerdiklerini sunuyoruz. dll kütüphaneleri benim durumumda Project2.dll ile

Şimdi bu prosedürleri çağırmak için hemen oluşturacağımız kodda bir yere isimlerini yazmamız yeterli. Standart sekmesinden 2 Düğme bileşenini forma bırakın ve OnClick'i kullanarak dış görünümde oluşturun

İlk düğmenin tıklanması:


Başlamak
İlk arama;
Son;

OnClick diğer düğmeler:


Başlamak
Çift Çağrı; // Ben dll'deki prosedürüm
Son;

Bu kadar!

Yöntem No.2:
Daha az karmaşıktır ancak avantajları vardır ve en önemlisi eklentiler için idealdir.
Zastosuvannya için Bu method, bir avuç küresel değişiklikten hemen etkileniyoruz:

Var
LibHandle: HModule; //Kütüphane modülüne gönderildi
İlk Çağrı: prosedür; stdçağrı;
//Kütüphanede bulunan prosedürlerimizin isimleri.

DoubleCall: prosedür; stdçağrı;

Daha sonra, uygulama anahtar sözcüğünden sonra kütüphanemize erişim için bir prosedür yazacağız:

Prosedür LoadMyLibrary(DosyaAdı: String);
Başlamak
LibHandle:=LoadLibrary(PWideChar(DosyaAdı));
//Kütüphaneyi büyülüyoruz!
// Saygı! 2009 Delphi'den daha düşük sürümler için PChar
LibHandle = 0 ise başlayın
Mesaj Kutusu(0;"";0,0);
Çıkış;
Son;
İlk Çağrı:= GetProcAddress(LibHandle,"FirstCall");
//Nesnenin göstergesini seç
// Kütüphane modülüne ilk parametre gönderildi
//dll'deki nesne adının 2. parametresi

DoubleCall:= GetProcAddress(LibHandle,"DoubleCall");
@FirstCall = sıfır ise başlayın

Mesaj Kutusu(0," Kütüphaneyi büyülemek imkansız",0,0);
Çıkış;
Son;
@DoubleCall = sıfır ise başlayın
// Kütüphanede bu fonksiyonun varlığını doğruluyoruz.
Mesaj Kutusu(0," Kütüphaneyi büyülemek imkansız",0,0);
Çıkış;
Son;

Formda oluşturulanlardan sonra örnekleyiciye OnCreate adı verilir; burada özenle oluşturulan prosedürün arkasında gurur duyuyoruz. kütüphane

Prosedür TForm1.FormCreate(Sender: TObject);
Başlamak
LoadMyLibrary("Proje2.dll");
Son;

Şimdi yine kütüphanemizden gerekli prosedürleri çağırmak için isimlerini kodun herhangi bir yerine eklememiz gerekiyor. Bunun için Standard sekmesinden forma 2 Button bileşeni bırakın ve OnClick kullanarak skin üzerinde oluşturun.

İlk düğmenin tıklanması:

Prosedür TForm1.Button1Click(Sender: TObject);
Başlamak
İlk arama; // Ben dll'deki prosedürüm
Son;

OnClick diğer düğmeler:

Prosedür TForm1.Button2Click(Sender: TObject);
Başlamak
Çift Çağrı; // Ben dll'deki prosedürüm
Son;

Sonunda, istediğimiz formda OnDestroy stilinin bir örnekleyicisini oluşturuyoruz. dll kütüphanesi hafızadan

Prosedür TForm1.FormDestroy(Sender: TObject);
Başlamak
FreeLibrary(LibHandle);
//Hafıza kütüphanesini canlandırıyoruz.
Son;

Bu kadar!

Sonuçları tamamlamanın başka bir yolu zahmetlidir ancak kütüphanede saklanan nesneyi belirtmenin bir artısı vardır.
Not: Delphi'deki en son Video derslerini, Sesli podcast'leri ve makaleleri yayınlamak için sitenize karar vermek ister misiniz?
Yarışmalara katılın ve yavaş yavaş ekibimize katılın?!
Ardından hemen sitenin ücretsiz multimedya beslemesine abone olun

Zaten 3500 kişiyi aştık!
  • Delphi DLL wiki'si
  • DLL kavramı
  • Delphi'de DLL oluşturma (dışa aktarma)
  • Delphi'de Vikoristannya DLL (içe aktarma)
  • VCL nesnelerinin verilerle çalışması için kullanılacak DLL
  • Delphi DLL wiki'si

DLL'deki durumları suçlama DOS'ta programlama sürecini tahmin edin. Bir programın çıktı metnini, derleme ve bağlama olmak üzere iki süreç dahil olmak üzere makine koduna dönüştürme. Bağlama işlemi sırasında, bir bağlantı düzenleyicisi bulunmaktadır. Modüllerin ötesinde

programlar, fonksiyonlar ve prosedürler gibi programların kod içerisine yerleştirilmesinin yanı sıra ek kod. Böylece bir program, bir program, bir üçüncüyü hazırladınız... Ve bu fonksiyonların kodları aracılığıyla programın geneline yerleştirildiler.

Program1 Program2: : MyFunc(:) MyFunc(:) : : fonksiyon kodu MyFunc fonksiyon kodu MyFunc diğer fonksiyon kodu diğer fonksiyon kodu

Peki standart eklenti olarak eklenen Dinamik Bağlantı Kitaplığı (DLL) nelerdir? Bunu anlamak için görev, program örneği ve modül kavramlarını açıklığa kavuşturmak gerekir.

Aynı programların birçok örneğini çalıştırdığınızda Windows, Veri deposu Kodun ve kaynakların yalnızca bir kopyası - bir dizi bitişik veri bölümü, yığın ve çekmece (böl. Şekil 3) oluşturan eklenti modülü, bunların bir seti standart Windows'ta bir görevdir. Bir programın kopyası, program modülünün derlendiği bağlamdır.

DLL – kütüphane aynı zamanda bir modüldür. Bellekte tek bir kopya halinde depolanır ve bir kod ve kaynak bölümünün yanı sıra bir veri bölümünü de içerir (böl. Şekil 4).

DLL, programlar tarafından yönetilen ve herhangi bir yığın veya bilgi gerektirmeyen bir kütüphanedir. DLL'lere yerleştirilen işlevler, yığınında çağrılan programın bağlamına yerleştirilir. Üstelik bu işlevler, programın bir kopyası değil, kütüphaneye ait olan veri bölümünün vikoristuyutudur.

DLL'nin bu organizasyonu nedeniyle, her şey pahasına bellek tasarrufu sağlanır programları çalıştırmak vikorista bir DLL modülü, biri veya diğeri dahil değil standart işlevler modüllerinizin deposuna.

Çoğunlukla DLL'ler, Pascal'da modüllerin (birim anlamında) kavramsal olarak planlanmasına benzer şekilde, bunlar ve diğer mantıksal işaretlerle birleştirilen işlev kümeleri etrafında oluşturulur. Aradaki fark, Pascal modüllerinden gelen işlevlerin bağlantı aşamasında statik olarak bağlanması ve DLL'lerden gelen işlevlerin çalışma zamanında dinamik olarak bağlanması gerçeğinde yatmaktadır.

DLL kavramı

DLL'yi programlamak için Delphi bir dizi sağlar anahtar kelimeler sözdizimini yönetir. Golovne - Delphi'deki DLL bir programla aynı projedir.

DLL şablonuna bir göz atalım:


Böyle bir şablonun proje dosyası adı MYDLL.DPR'dir.

Ne yazık ki Delphi IDE otomatik olarak yalnızca proje programlarını oluşturur, bu nedenle DLL projesini manuel olarak hazırlamanız gerekecektir. Delphi 2.0'da bu kullanışlılık eksikliği ortadan kaldırılmıştır.

Bir programda olduğu gibi DLL'de de bir kullanımlar bölümü vardır. Başlatma kısmı zorunlu değildir. Dışa aktarma bölümünde, erişimin harici eklentilerden kaldırılması gereken yeni işlevler bulunacaktır.

Dışa aktarma işlevleri (veya prosedürleri) çeşitli şekillerde yapılabilir:

  • numaraya göre (indeks)
  • isimle

Farklı sözdizimi açıkça açıklanmıştır:


Windows, DLL'lerin "yerleşik işlevleri" kavramına sahip olduğundan, yani DLL'nin bellekte olduğu süre boyunca bellekte kalan işlevler olduğundan, Delphi'nin bu tür şeyleri organize etme ve dışa aktarma yolları vardır:


Daha sonra, dışa aktarılan işlevin indekslenmesi Delphi tarafından otomatik olarak oluşturulacak ve bu tür bir dışa aktarma, işlev adıyla kaçınılan ada göre dışa aktarma işlemiyle gerçekleştirilecektir. Programda içe aktarılan işlevi kullanmak için, DLL'deki işlevi kullanmaktan kaçınabilirsiniz. İçe aktarılan işlevlere eklenen yönergelere gelince, aşağıda bunlardan bahsedeceğiz.

Delphi'de DLL oluşturma (dışa aktarma)

O zaman ithalatı organize etmek için. Delphi, DLL'lerden dışa aktarılan işlevlere ve bunların dışa aktarımına erişim için standart değerler sağlar.

Daha pratik uygulamalar için programınız, DLL ile içe aktarılan işlevleri şu şekilde listelemelidir:


Bu yönteme statik içe aktarma denir.

Fark etmiş olabileceğiniz gibi, DLL olan dosya uzantısı belirtilmemiştir - üreticiler için *.DLL ve *.EXE dosyaları dikkate alınır. Dosyanın farklı bir uzantısı varsa (örneğin, Delphi'deki COMPLIB.DCL gibi) veya DLL'leri ve içe aktarılan işlevleri dinamik olarak atamanız gerekiyorsa (örneğin, programınız farklı grafik formatları ve derileri için DLL oksit var.)?

Bu tür sorunları çözmek için doğrudan dinamik içe aktarma adı verilen Windows API'sine gidebilirsiniz:


kullanır WinTypes, WinProcs, ...; tip TMyProc = prosedür ; var Kolu: Kolu; MyImportProc: TMyProc; başlamak Tanıtıcı:= LoadLibrary("MYDLL"); eğer Kulp >= 32 Daha sonra (eğer başlamak@MyImportProc:= GetProcAddress(Handle, "MYEXPORTPROC"); eğer MyImportProc'um sıfır Daha sonra ... (içe aktarılan prosedür kullanılarak) son; FreeLibrary(Tanıtıcı); son;

Dışa aktarma/içe aktarma, DLL çıkış noktalarının değiştirilmesi ve diğer uygulamalar gibi sözdizimsel diyagramları OnLine Help Delphi'de, Delphi için Borland RAD Pack'te bulunan Object Pascal Dil Kılavuzu'nda ve örneğin "Teach" kitabında bulabilirsiniz. 21 Günde Kendiniz Delphi".

Derleyici tarafından oluşturulan koddan bahsetmiyorum bile (daha fazla optimizasyon söz konusudur), Borland Pascal 7.0'da olduğu gibi tüm sözdizimi kuralları kaybolmuştur.

Delphi'de Vikoristannya DLL (içe aktarma)

Kendi dinamik kitaplığınızı oluşturduktan sonra diğer DLL'lerden işlev çağrılarını çıkarabilirsiniz. Böyle bir DLL örneği Delphi ile birlikte verilmektedir (X: DELPHI DEMOS BDEDLL). Bu DLL, bir tablodaki verileri görüntüleyen bir form içerir ve VCL nesnelerine (TTable, TDBGrid, TSession) erişmek için kullanılır ve bunlar da BDE işlevlerini çağırır. Bu noktaya kadar yapılan yorumlardan da anlaşılacağı gibi, böyle bir DLL için bir değişim var: görev çıkartmasını hemen vikorize edemiyorlar. Bu, DB modülü bağlandığında otomatik olarak oluşturulan Session nesnesinin görev için değil modül için başlatıldığı anlamına gelir. Bu DLL'yi başka programlarla içe aktarmaya çalışırsanız, merhametiniz kalmaz. DLL'lerin bir dizi görev tarafından anında indirilmesini durdurmak için eylemler gerçekleştirmeniz gerekir. Uygulama, DLL'nin şu anda diğer görevler için test edilip edilmediğini doğrulamaya yönelik bir prosedüre sahiptir.

VCL nesnelerinin verilerle çalışması için kullanılacak DLL

Delphi'de oluşturulan bir DLL'deki hata durumu, bu durum DLL'nin ortasında yer almadığı için tüm programların başarısız olmasıyla sonuçlanmıştır. Bu nedenle, DLL geliştirme sırasında olası tüm sorunlara dikkat etmek önemlidir. Oluşturulan fonksiyonun içe aktarılan sonucunun seri veya sayı şeklinde döndürülmesi ve gerekirse hatalı durumun programa yeniden girilmesi önerilebilir.


işlevİşlevim: sicim; başlamak denemek (Vlasne işlev kodu) hariç Açık Sonuç: İstisna Yapmak Sonuç:=Biçim(DllErrorViewingTable, ) başka Sonuç:= Format(DllErrorViewingTable, ["Bilinmeyen hata"]); son; son;

Program kodu:


StrResult:= İşlevim; eğer StrSonuç "" Daha sonra artırmak Exception.Create(StrResult);

Stattya Zaten 3500 kişiyi aştık! bölüm Dosya sistemi DLL'ler ve Eklentiler Delphi ve FreePascal geliştiricileri için yararlı olabilir.

Kısaltma DLL"dinamik olarak bağlantılı bir kütüphane" anlamına gelir. Delphi'deki Dll Bu robotlar tarafından yapılması gereken bir dosyadır bilgisayar programı programın yürütme aşamasında bağlı olduğu prosedürler ve işlevler.

Görünüşe göre gerekli tüm alt programlar, ek bir program oluşturmanın gerekli olduğu programların gövdesinde açıklanabilir. dll dosyası ve ölüm saatinde onunla buluşacak mısın? Daha fazla esneklik için deneyin program tarafından oluşturulan. Zaman içerisinde veri işleme algoritmaları değişebilir. İşleme işlemleri birçok program tarafından gerçekleştirileceğinden, büyük dosyayı yeniden derleyip yöneticilere yeniden iletmek zorunda kalacaklar. Birkaç prosedür gerektirecek küçük bir dll dosyasını aktarmak ve otomatik olarak çalıştırmak çok daha kolaydır.

Ayrıca dll kütüphanesinin çalışmaları oluşturulacağı programda kalmayacaktır. Bu nedenle, kokuşmuş programlamamızı düşünmeden, programlarımız için dll'lerin oluşturulmasını üçüncü taraf geliştiricilere emanet edebiliriz. Bütün bunlar başlangıçta bitmiş projenin tamamlanmasını ve yöneticilere devredilmesini büyük ölçüde hızlandıracaktır.

DLL Kitaplığı Oluşturma

Delphi'de dll oluştur Olumsuz katlanır kapı Ek modül. Komutu kullanın Dosya -> Yeni -> -> Diğer... Görüntülenen iletişim kutusunda DLL Wisard simgesini seçin. Sonuç olarak Delphi bir DLL kütüphane projesi oluşturacaktır:

kütüphane 1. Proje;

(DLL bellek yönetimi hakkında önemli not: ShareMem
kütüphanenizin USES cümlesindeki VE projenizdeki ilk ünite (seçin)
Proje Görüntüleme Kaynağı) DLL'niz herhangi bir prosedürü dışa aktarıyorsa USES yan tümcesini veya
dizeleri ileten işlevler - parametreler veya sonuç işlevleri. Bu
DLL'nize ve DLL'nizden iletilen tüm dizeler için geçerlidir;
kayıtlarda ve sınıflarda yuvalanmıştır. ShareMem, arayüz birimidir.
birlikte dağıtılması gereken BORLNDMM.DLL paylaşılan bellek yöneticisi
DLL'inizle. BORLNDMM.DLL'yi kullanmak için dize bilgilerini iletin
Vikorist PChar veya ShortString parametreleri. )

kullanır
SistemUtils
Sınıflar;

($R *.res)

başlamak
son
.

Yeni dll kütüphanesi için bir isim seçin ve komutu seçerek onu yakındaki bir klasöre kaydedin. Dosya -> Farklı kaydet... Babanın dll dosyasının dahil edilmeyeceği 4 dosyası var. Bu şaşırtıcı, çok basit metin dosyaları Projeyi anlatmak için Bir dll kütüphanesi dll dosyası oluşturmak için projeyi derlemeniz gerekir. Takımı takip et Proje -> Projeyi Derle. Sonuç olarak klasörümüzde ana programın bağlanacağı bir dll dosyası görünecektir.

Kütüphane hâlâ boş.

...şimdi düzenleme aşamasında...



Girmek

Programlama teknolojilerinin hızla gelişmesi nedeniyle, giderek daha fazla insan programlarının yeteneklerini artırma sorunuyla karşı karşıya kalıyor. Bu makale programın kendisine ve Borland Delphi'deki DLL programlamaya ayrılmıştır. Ayrıca dokunduğumuz parçalar besleyici shodo vikoristannya'dır. DLL kitaplıkları, bu durumda yabancı DLL'lerden (WinAPI gibi sistem olanlar dahil) işlevleri içe aktarmak faydalıdır.

DLL Durum Alanları

Peki gerekli DLL'ler nelerdir ve bunlar nerede vikorize edilecek?

Kütüphanenin çevresinde programcılar için bir yer var Ek fonksyonlar. Örneğin, satırlarla çalışmaya yönelik işlevler veya görüntüleri dönüştürmek için kitaplıkları katlama. Kaynak depolama DLL'leri hem program işlevlerini hem de işlevleri ve ayrıca simgeler, simgeler, satır dizileri, menüler vb. çeşitli kaynakları depolayabilir. Destek kitaplıkları Örnek olarak şu popüler paketlerin kitaplıklarını bulabilirsiniz: DirectX, ICQAPI (ICQ için API), OpenGL, vb. Programların bölümleri Örneğin, bir program penceresini (formları) bir DLL'den kaydedebilirsiniz. Eklentiler Burası programcının düşüncelerinin ana alanıdır! Eklentiler, programların yeteneklerini genişleten uzantılardır. Örneğin bu yazıda programlar için eklenti oluşturma teorisine bakacağız. Bir DLL (Dinamik Bağlantı Kitaplığı) kaynağı çeşitli programlar veya işlemler arasında paylaşılabilir (diğer adıyla paylaşım - paylaşılan bir kaynak)

DLL'lerle çalışmaya yönelik işlevlerin ve tekniklerin kısa bir açıklaması

Peki DLL'lerle çalışabilmek için bu işlevlerin nasıl değiştirilmesi gerekiyor? Bir kitaplıktan işlevleri içe aktarmak için iki yönteme bakalım:

1 yol. Bir DLL'yi bir programa bağlama.

Bu, bir DLL'den içe aktarılan işlevleri seçmenin en basit ve en kolay yöntemidir. Bununla birlikte (ve adil olmak gerekirse), bu yöntem çok kusurludur - vikory programı gibi bir kitaplık bulunamazsa, program başlamaz ve görünüşe göre DLL kaynağının bulunmadığına dair uyarı verir. Kütüphanede de aramalar var: akış kataloğunda, program kataloğunda, WINDOWS\SYSTEM kataloğunda vb. Koçanı için bunun zagal formu alınır:


İşlevAdı (veya ProsedürAdı) - programınızda kullanılacak işlevin (veya yordamın) adı; Par1, Par2, ... fonksiyon ve prosedürlerin parametrelerinin adları; Par1Type, Par2Type, ... fonksiyon ve prosedürlerin parametre türleri (örneğin, Tamsayı); ReturnType döndürülen değerin türüdür (yalnızca işlev için); DLL'nin kendisinde kaçınılması gereken stdcall yönergesi; Verilen işlevin veya yordamın alınacağı harici DLL'nin adını belirten harici "DLLNAME.DLL" yönergesi (içinde bu adama- DLLNAME.DLL); name "FunctionName" ("ProcedureName"), DLL'nin kendisindeki işlevin adını tam olarak belirten bir yönergedir. Bu, programda adı verilen ve doğru kabul edilen (kütüphanecinin dediği gibi) bir işlevi kullanmanıza izin veren, bağlayıcı olmayan bir yönergedir; index FunctionIndex (ProcedureIndex), bir DLL'deki bir işlevin veya prosedürün seri numarasını gösteren bir yönergedir. Bu aynı zamanda bağlayıcı olmayan bir direktiftir.

Bu çok karmaşık ama zarif bir yöntemdir. İlk yönteme göre herhangi bir azalma söz konusu değildir. Kabul edilemez olan tek şey, bu amaç için gerekli kodun kullanılması ve DLL'den içe aktarılan işlevin yalnızca DLL'nin içe aktarılmış olması ve bellekte bulunması durumunda kullanılabilir olmasının karmaşıklığıdır... bizi daha net tanıyabilirsin, ama hoşçakal - Kısa Açıklama Vikoristovyh cym yöntemi WinAPI işlevleri:

LoadLibrary(LibFileName: PChar), belirtilen LibFileName kitaplığını belleğe yükler. Başarılı bir şekilde tamamlandıktan sonra işlev, bellekteki DLL tanıtıcısını (THandle) döndürür. GetProcAddress(Module: THandle; ProcName: PChar) dışa aktarılan kitaplık işlevinin adresini okur. Başarılı bir şekilde tamamlandıktan sonra işlev, içe aktarılan DLL'nin işlevinin tanıtıcısını (TFarProc) döndürür. FreeLibrary(LibModule: THandle), etkin olmayan LibModule'u kurtarır ve onunla ilişkili belleği serbest bırakır. Lütfen bu prosedürden sonra bu kütüphanenin fonksiyonlarının artık kullanılamayacağını unutmayın.

Pratik yapın ve uygulayın

Artık çok çeşitli yöntem ve tekniklerin birkaç uygulamasını tanıtmanın zamanı geldi:

Örnek 1. DLL'yi programa bağlama


Şimdi aynı şekilde, ancak farklı bir şekilde - dinamik cazibe merkezleriyle:


Not:

Kütüphane işlevlerinde dize türü kullanılırken aşağıdakiler kullanılmalıdır, çünkü Bu tür bozulmalarla birlikte “bellek bozulması” ile ilgili sorunlar ortaya çıkar. Bununla ilgili raporu (İngilizce de olsa) Delphi'nin oluşturduğu yeni DLL projesinin metninden (Dosya -> Yeni -> DLL) okuyabilirsiniz. Bu nedenle, PChar'ı kullanmak ve ardından StrPas işlevini kullanarak onu dizeye dönüştürmek daha iyidir.

Şimdi DLL'nin kendisine daha yakından bakalım:

Örnek 3. MYDLL.DPR projesi günlüğü


Kaynakların ve formların DLL'lere yerleştirilmesi

DLL'ler işlevleri, imleçleri, küçük nesneleri, simgeleri, menüleri ve metin satırlarını barındırabilir. Hiçbir şeyi dert etmeyelim. Ayrıca, bir kaynak elde etmek için bir DLL edinmenin ve tanımlayıcısını kaldırdıktan sonra, ilgili işlevle (LoadIcon, LoadCursor, vb.) Kaynağın kendisini elde etmenin gerekli olduğunu da not edeceğim. Bölümü, Windows programlarının DLL kitaplıklarında üçten az dokunulabilir yerleşime sahiptir (Delphi'deki formlara benzer).

Bunu yapmak için yeni bir DLL oluşturmanız ve ona yeni bir form eklemeniz gerekir (Dosya -> Yeni -> DLL ve ardından - Dosya -> Yeni Form). Ayrıca, eğer form bir iletişim kutusu ise (kalıcı form (bsDialog)) DLL dosyasına eklenir. Fonksiyona adım atacağım(örneğin, formun adı Form1 ve sınıfının adı TForm1'dir):

Örnek 4. Formun DLL'ye yerleştirilmesi


Bir DLL'ye kalıcı olmayan bir form yerleştirmeniz gerekiyorsa, iki işlev oluşturmanız gerekir; formu açma ve kapatma. Bu durumda bu formun tanımlayıcısını hatırlamak için bir DLL kullanmanız gerekir.

Eklentilerin oluşturulması

Burada eklentilere ayrıntılı olarak bakıyoruz, çünkü... Aşağıdaki örnekler, DLL programlamanın sol tarafında kolayca gezinmenize yardımcı olacaktır. Eklentinin programa yeteneklerini genişleten bir eklenti olduğunu hatırlatmama izin verin. Bu durumda programın kendisinin bu tür ek özelliklerin varlığını aktarması ve bunların önemini kaybetmesine izin vermesi zorunludur.

Örneğin, eklentiyi daha önce oluşturmak için grafik editörü Yeniden oluşturulan görüntüyü tamamladığınızda, eklentideki en az iki işlevi aktarmanız gerekecektir (ve tabii ki programdaki işlevlere tıklamalısınız) - bu eklentiyi menüye eklemek için fişi başka bir türe (veya başka bir türe) döndüren işlev (veya araç çubuğunda), artı ana işlev- görüntülerin iletilmesi ve alınması. Tobto. Başlangıçta program eklentileri arar, ardından bulunan her eklenti için kesin olarak seçilmiş adlardan (örneğin, GetPluginName) gecikmeli işlevine tıklar ve gerekli öğeyi menüye ekler, ardından bu öğeyi seçtikten sonra - Başka birine tıklayın görüntü girişini ileten işlev (veya "görüntüyü değiştirmek için dosyalıyorum) ve bu işlev, kendi yöntemiyle görüntüyü toplar ve onu yeni bir görünüme döndürür (veya dosyayı yeni görüntülerle adlandırır). Eklentinin ekseni ve özü...

Sonsöz

Bu makale Borland Delphi'den DLL'lerin geliştirilmesi ve oluşturulmasının ana yönlerini göstermektedir. Yiyeceğiniz varsa bana e-postayla gönderin:

Ortada Delphi programlama DLL kitaplıklarının esnek oluşturulması için aktarılan özellikler.

İşlevi tamamlamak için şarkı söylemek için bir kütüphane oluşturalım

GetArea(a, b, c: GERÇEK): GERÇEK.

Bu fonksiyon, tricut'ın neredeyse iki tarafına girdi sağlar. Fonksiyon belirli bir trikumusun alanını döndürür:

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

Sonuç:=SQRT(p*(p-a)*(p-b)*(p-c))

D'yi Başlatelfive sonra ev alışılmadık. Menü öğelerini seçin FileNewÖorada, sonunda N yer işaretinde görünen şeyewDLL W simgesine tıklayınizard. ( algoritma sürüm altında tutulur)

Kimin DLL kütüphane dosyası oluşturuldu. Vіn birincil modüle çok benzer (birim) Delfi, yalnızca operatörle başlarKütüphane. Projeyi DLL kütüphanesi adı altında kaydetmek için şunu söyleyin:GetA. İsimGetAreaVikorist olmak mümkün değil; zaten onların işlevlerini üstleneceksiniz.

Şimdi operatörden sonraKULLANIMFonksiyonumuzun metnini başlıkta bazı değişikliklerle birlikte yazıyoruz:

FONKSİYON GetArea(a, b, c:REAL):REAL;ihracat;

EXPORT anahtar sözcüğü, işlevin dışa aktarıldığını ve harici programlardan görülebileceğini belirtir.

Fonksiyonun metni atandıktan sonra

GetArea;

EXPORTS operatörü, kütüphanelerden dışarı aktarılan tüm prosedürleri ve işlevleri kapsar. Bu, kütüphanemizin bir nevi kataloğudur.

Bir kütüphanede çalıştırmak imkansızdır ve derlenmemiş olabilir. Bu pencere için menü öğesi Proje → Oluştur'dur. Her şey doğru organize edildiyse, akış dizininin diskinde geta.dll adlı bir dosya oluşturulacaktır. Burası bizim kütüphanemiz.

Daha saygılı bir şekilde: Kütüphanede bulunan prosedür ve fonksiyonların, STRING tipi parametrelerin geçirilmesinde bariz bir incelik vardır.

STRING tipi parametreleri geçirebilmek için kütüphanenin ve onu çağıran programın USES ifadelerine gidin, ShareMem modülünün bağlantılarını kaydedin ve ayrıca basit bir şekilde bu modülün ilk açılmasını sağlayın. liste. Üstelik borlndmm.dll dosyasını kütüphaneden kolayca eklemeniz gerekecek (bu, Delphi kurulumuna dahildir). Bu durumun üstesinden gelmek kolaydır: metin türü ve kısa dize veri türü parametreleri için bir izleme (tek satır veya en fazla 255 karakter) ve bir PChar (metin satırına işaretçi).

Wikilik dll

DLL'lerden prosedür ve işlevleri çağırmanın iki yolu vardır. İlk aşamada, programı geliştirme aşamasında, DLL'nin ona bağlanacağını biliyoruz (çoğunlukla bu DLL'yi kendimiz yaratırız). Başka bir versiyonda, “yabancı” olanlar da dahil olmak üzere oldukça büyük bir kütüphaneye bağlanıyoruz.

Statik çağrı

İlk yöntemi uygulamak için çağrılan statik bağlantılar, yeni bir başlangıç ​​programı oluşturun, forma LabeledEdit1...LabeledEdit3 üç giriş alanı, bir düğme ve bir Tlabel bileşeni yerleştirin. IMPLEMENTATION deyiminden sonra GetArea fonksiyonunun geta.dll kütüphanesinden içe aktarılmasını sağlayacak bir satır ekleyin:

GetArea işlevi (a, b, c: gerçek): REAL; UZAK;

DIŞ "Geta";

EXTERNAL kelimesi, bu işlevin gövdesinin kütüphanede belirtilen adlardan bulunduğunu belirtir ve FAR kelimesi, çağrı yapan program için gerekli olan ve ekranın bir tarafında bulunan "uzun" 4 baytlık adreslerin depolanmasını belirtir. bellek ve DLL kitaplığı - diğerinde. Açıkçası, geta.dll dosyasının tüm akış programı dosyalarının bulunduğu dizine yerleştirilmesi gerekir.

Analizör bir dizi oluşturmak ve bunu kütüphane fonksiyonuna aktarmak ve sonucu ekranda görüntülemek için bir düğmeye basar:

© 2022 androidas.ru - Android hakkında her şey