Static vs Dynamic DLL Φόρτωση με Delphi

Μια βιβλιοθήκη δυναμικής σύνδεσης (DLL) λειτουργεί ως κοινόχρηστη βιβλιοθήκη λειτουργιών που μπορούν να καλούνται από πολλές εφαρμογές και άλλα DLL. Ο Δελφός σάς επιτρέπει δημιουργούν και χρησιμοποιούν DLLs ώστε να μπορείτε να καλέσετε αυτές τις λειτουργίες κατά βούληση. Ωστόσο, πρέπει να εισαγάγετε αυτές τις ρουτίνες πριν μπορέσετε να τις καλέσετε.

Οι λειτουργίες που εξάγονται από ένα αρχείο DLL μπορούν να εισαχθούν με δύο τρόπους - δηλώνοντας μια εξωτερική διαδικασία ή μια λειτουργία (στατική) ή μέσω απευθείας κλήσεων σε συγκεκριμένες λειτουργίες API (δυναμική) του DLL.

Ας εξετάσουμε ένα απλό DLL. Παρακάτω είναι ο κώδικας για το "circle.dll" που εξάγει μια συνάρτηση, που ονομάζεται "CircleArea", η οποία υπολογίζει την περιοχή ενός κύκλου χρησιμοποιώντας τη δεδομένη ακτίνα:

Μόλις έχετε τον circle.dll, μπορείτε να χρησιμοποιήσετε την εξαγόμενη λειτουργία "CircleArea" από την εφαρμογή σας.

Στατική φόρτωση

Ο απλούστερος τρόπος εισαγωγής μιας διαδικασίας ή μιας λειτουργίας είναι να την δηλώσετε χρησιμοποιώντας την εξωτερική οδηγία:

instagram viewer

Αν συμπεριλάβετε αυτήν τη δήλωση στο τμήμα διασύνδεσης μιας μονάδας, το circle.dll φορτώνεται μία φορά κατά την εκκίνηση του προγράμματος. Κατά τη διάρκεια εκτέλεσης του προγράμματος, η λειτουργία CircleArea είναι διαθέσιμη σε όλες τις μονάδες που χρησιμοποιούν τη μονάδα όπου βρίσκεται η παραπάνω δήλωση.

Δυναμική φόρτωση

Μπορείτε να αποκτήσετε πρόσβαση σε ρουτίνες σε μια βιβλιοθήκη μέσω απευθείας κλήσεων σε API Win32, συμπεριλαμβανομένων των LoadLibrary, FreeLibrary, και GetProcAddress. Αυτές οι λειτουργίες δηλώνονται στα Windows.pas.

Δείτε πώς μπορείτε να καλέσετε τη λειτουργία CircleArea χρησιμοποιώντας δυναμική φόρτωση:

Κατά την εισαγωγή χρησιμοποιώντας τη δυναμική φόρτωση, το αρχείο DLL δεν φορτώνεται μέχρι την κλήση στο LoadLibrary. Η βιβλιοθήκη εκφορτώνεται από το τηλεφωνήστε στο FreeLibrary.

Με τη στατική φόρτωση, φορτώνεται το αρχείο DLL και εκτελούνται οι ενότητες αρχικοποίησης πριν εκτελεστούν οι ενότητες αρχικοποίησης της κλήσης της εφαρμογής. Αυτό αντιστρέφεται με δυναμική φόρτωση.

Πρέπει να χρησιμοποιήσετε στατική ή δυναμική;

Ακολουθεί μια απλή ματιά στα πλεονεκτήματα και τα μειονεκτήματα τόσο της στατικής όσο και της δυναμικής φόρτωσης DLL:

Στατική φόρτωση

Πλεονεκτήματα:

  • Ευκολότερη για έναν αρχάριο προγραμματιστή. όχι "άσχημο" API κλήσεις.
  • Τα αρχεία DLL φορτώνονται μόνο μία φορά, όταν ξεκινά το πρόγραμμα.

Μειονεκτήματα:

  • Η εφαρμογή δεν θα ξεκινήσει αν λείπουν DLL ή δεν μπορούν να βρεθούν. Θα εμφανιστεί ένα μήνυμα σφάλματος όπως αυτό: "Αυτή η εφαρμογή απέτυχε να ξεκινήσει επειδή δεν βρέθηκε το αρχείο" missing.dll ". Η επανεγκατάσταση της εφαρμογής ενδέχεται να διορθώσει αυτό το πρόβλημα ". Κατά σχεδιασμό, η σειρά αναζήτησης DLL με στατική σύνδεση περιλαμβάνει τον κατάλογο από τον οποίο βρίσκεται η εφαρμογή, τον κατάλογο συστήματος, τον κατάλογο των Windows και τους καταλόγους που αναφέρονται στο περιβάλλον PATH μεταβλητός. Σημειώστε επίσης ότι η σειρά αναζήτησης ενδέχεται να διαφέρει για διάφορες εκδόσεις των Windows. Πάντα αναμένετε να έχετε όλα τα DLL στον κατάλογο όπου είναι η κλήση.
  • Χρησιμοποιείται περισσότερη μνήμη από τη στιγμή που όλα τα αρχεία DLL φορτώνονται ακόμα και αν δεν χρησιμοποιείτε ορισμένες από τις λειτουργίες

Δυναμική φόρτωση

Πλεονεκτήματα:

  • Μπορείτε να εκτελέσετε το πρόγραμμά σας ακόμα και όταν δεν υπάρχουν ορισμένες από τις βιβλιοθήκες που χρησιμοποιεί.
  • Μικρότερη κατανάλωση μνήμης από τη χρήση των DLL μόνο όταν απαιτείται.
  • Μπορείτε να καθορίσετε την πλήρη διαδρομή προς το αρχείο DLL.
  • Μπορεί να χρησιμοποιηθεί για αρθρωτές εφαρμογές. Η εφαρμογή εκθέτει μόνο (φορτώνει) ενότητες (DLL) "εγκεκριμένες" για το χρήστη.
  • Η δυνατότητα δυναμικής φόρτωσης και εκφόρτωσης της βιβλιοθήκης, είναι η βάση ενός συστήματος plug-in που επιτρέπει σε έναν προγραμματιστή να προσθέσει επιπλέον λειτουργικότητα σε προγράμματα.
  • Συμβατότητα προς τα πίσω με παλαιότερες εκδόσεις των Windows, στις οποίες τα DLL του συστήματος ενδέχεται να μην υποστηρίζουν τις ίδιες λειτουργίες ή να υποστηρίζονται με τον ίδιο τρόπο. Ανιχνεύοντας πρώτα την έκδοση των Windows και, στη συνέχεια, συνδέοντας δυναμικά με βάση το περιεχόμενο της εφαρμογής σας, σας επιτρέπει να υποστηρίξετε περισσότερα εκδόσεις των Windows και να παράσχει λύσεις για τα παλαιότερα λειτουργικά συστήματα (ή τουλάχιστον, απαγορεύοντας με χαριτωμένα χαρακτηριστικά που δεν μπορείτε υποστήριξη.)

Μειονεκτήματα:

  • Απαιτείται περισσότερος κώδικας, ο οποίος δεν είναι πάντα εύκολος για έναν αρχάριο προγραμματιστή.
instagram story viewer