Τοποθετήστε ένα αρχείο DLL από έναν πόρο απευθείας από τη μνήμη

Ιδέα άρθρου από τον Mark E. Βρύο

Το άρθρο πώς να αποθηκεύσετε ένα αρχείο DLL σε ένα αρχείο exe του προγράμματος Delphi ως πηγή εξηγεί πώς να στείλετε ένα αρχείο DLL με το εκτελέσιμο αρχείο εφαρμογής Delphi ως πόρο.

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

Χρησιμοποιώντας αρχεία πόρων (.RES), μπορείτε να ενσωματώσετε (και να χρησιμοποιήσετε) αρχεία ήχου, βίντεο κλιπ, κινούμενα σχέδια και γενικότερα οποιοδήποτε είδος δυαδικών αρχείων σε εκτελέσιμο Delphi.

Φόρτωση DLL από τη μνήμη

εάν ένα αρχείο DLL που είναι αποθηκευμένο σε ένα RES μπορεί να χρησιμοποιηθεί χωρίς να το αποθηκεύσετε πρώτα στο σύστημα αρχείων (σκληρός δίσκος)

Σύμφωνα με το άρθρο Φόρτωση ενός αρχείου DLL από τη μνήμη από τον Joachim Bauch, αυτό είναι δυνατό.

Εδώ ο Joachim εξετάζει το ζήτημα: Οι προεπιλεγμένες λειτουργίες API των Windows για τη φόρτωση εξωτερικών βιβλιοθηκών σε ένα πρόγραμμα (LoadLibrary, LoadLibraryEx) λειτουργούν μόνο με αρχεία στο σύστημα αρχείων. Επομένως, είναι αδύνατο να φορτώσετε ένα αρχείο DLL από τη μνήμη. Αλλά μερικές φορές, χρειάζεστε ακριβώς αυτή τη λειτουργία (π.χ. δεν θέλετε να διανείμετε πολλά αρχεία ή θέλετε να κάνετε την αποσυναρμολόγηση πιο σκληρά). Κοινή λύση για αυτά τα προβλήματα είναι να γράψετε πρώτα το αρχείο DLL σε ένα προσωρινό αρχείο και να το εισαγάγετε από εκεί. Όταν τερματίσει το πρόγραμμα, το προσωρινό αρχείο διαγράφεται.

instagram viewer

Ο κώδικας στο αναφερόμενο άρθρο είναι C ++, το επόμενο βήμα ήταν να το μετατρέψουμε σε Δελφούς. Ευτυχώς, αυτό έχει ήδη γίνει από τον Martin Offenwanger (ο συγγραφέας του DSPlayer).

Μονάδα μνήμης από τον Martin Offenwanger είναι μια εκτεταμένη έκδοση Delphi (και επίσης Lazarus) συμβατή με το C ++ του Joachim Bauch Μονάδα μνήμης 0.0.1. Το πακέτο zip περιλαμβάνει τον πλήρη πηγαίο κώδικα Delphi του MemoyModule (BTMemoryModule.pas). Επιπλέον, συμπεριλαμβάνεται ένας Δελφός και ένα δείγμα που να δείχνει πώς να το χρησιμοποιήσετε.

Φόρτωση DLL από πηγές από μνήμη

Εάν ένα demo DLL αποθηκεύεται ως πόρος χρησιμοποιώντας το αρχείο RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
ξεκινήσει
αν 0 <> ΕύρεσηResource (hInstance, 'DemoDLL', RT_RCDATA) έπειτα
ξεκινήσει
rs: = TResourceStream. Δημιουργία (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Δημιουργώ;
δοκιμάστε
Κυρία. LoadFromStream (rs);
Κυρία. Θέση: = 0;
m_DllDataSize: = ms. Μέγεθος;
mp_DllData: = GetMemory (m_DllDataSize);
Κυρία. Διαβάστε (mp_DllData ^, m_DllDataSize);
τελικά
Κυρία. Ελεύθερος;
rs. Ελεύθερος;
τέλος;
τέλος;
τέλος;
var
btMM: PBTMemoryModule;
ξεκινήσει
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize).
δοκιμάστε
αν btMM = μηδένέπειτα Αποβάλλω;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
αν @m_TestCallstd = μηδέν τότε Abort;
m_TestCallstd ('Αυτή είναι μια κλήση μνήμης Dll!');
εκτός
Εμφάνιση μηνύματος ('Παρουσιάστηκε σφάλμα κατά τη φόρτωση του dll:' + BTMemoryGetLastError);
τέλος;
αν Ανατεθεί (btMM) έπειτα BTMemoryFreeLibrary (btMM);
τέλος;
  1. Έχετε / Δημιουργία ενός DLL
  2. Αποθηκεύστε το αρχείο DLL σε αρχείο RES
  3. Εχω Εφαρμογή BTMemoryModule.
  4. Πιάσε το DLL από τον πόρο και φορτώστε το απευθείας στη μνήμη.
  5. Χρησιμοποιήστε τις μεθόδους BTMemoryModule για να εκτελέσετε τη διαδικασία από το αρχείο DLL στη μνήμη.

BTMemoryLoadLibary στους Δελφούς 2009, 2010,...

"Το συνδεδεμένο BTMemoryModule.pas δεν λειτουργεί με τους Delphi 2009 (και θα ήθελα επίσης να αναλάβω τους Delphi 2010 επίσης).
Βρήκα μια παρόμοια έκδοση του αρχείου BTMemoryModule.pas πριν από λίγο και έκανα αλλαγές, ώστε να λειτουργεί με (τουλάχιστον) τους Delphi 2006, 2007 και 2009. Το ενημερωμένο μου BTMemoryModule.pas και ένα δείγμα έργου είναι στο BTMemoryLoadLibary για τους Δελφούς> = 2009"