تحميل DLL من مورد مباشرة من الذاكرة

فكرة المقال بقلم مارك إ. طحلب

توضح المقالة كيفية تخزين DLL داخل ملف exe لبرنامج Delphi كمورد كيفية شحن DLL مع ملف قابل للتنفيذ لتطبيق Delphi الخاص بك كمورد.

مكتبات الارتباط الديناميكي يحتوي على تعليمات برمجية أو موارد قابلة للمشاركة ، وهي توفر إمكانية لتطبيقات متعددة مشاركة نسخة واحدة من روتين (أو مورد) مشترك بينهما.

باستخدام ملفات الموارد (.RES)، يمكنك تضمين (واستخدام) ملفات الصوت ومقاطع الفيديو والرسوم المتحركة وبشكل أعم أي نوع من الملفات الثنائية في Delphi القابل للتنفيذ.

تحميل DLLs من الذاكرة

إذا كان يمكن استخدام ملف DLL المخزن في RES دون حفظه أولاً على نظام الملفات (القرص الثابت)

وفقا للمادة تحميل DLL من الذاكرة بواسطة يواكيم باوش ، هذا ممكن.

إليك كيف ينظر يواكيم إلى المشكلة: تعمل واجهات برمجة تطبيقات windows الافتراضية لتحميل المكتبات الخارجية في برنامج (LoadLibrary، LoadLibraryEx) فقط مع الملفات الموجودة على نظام الملفات. لذلك من المستحيل تحميل DLL من الذاكرة. لكن في بعض الأحيان ، تحتاج إلى هذه الوظيفة بالضبط (على سبيل المثال لا ترغب في توزيع الكثير من الملفات أو تريد جعل التفكيك أكثر صعوبة). تتمثل الحلول الشائعة لهذه المشكلات في كتابة DLL في ملف مؤقت أولاً واستيراده من هناك. عند انتهاء البرنامج ، يتم حذف الملف المؤقت.

instagram viewer

الكود في المقالة المذكورة هو C ++ ، والخطوة التالية كانت لتحويله إلى دلفي. لحسن الحظ ، تم ذلك بالفعل بواسطة Martin Offenwanger (مؤلف DSPlayer).

وحدة الذاكرة بقلم مارتن أوفينوانجر هو نسخة موسعة متوافقة مع دلفي (وكذلك لازاروس) من سيواكيم بوتش C ++ وحدة الذاكرة 0.0.1. تتضمن الحزمة zip شفرة مصدر دلفي الكاملة ل MemoyModule (BTMemoryModule.pas). علاوة على ذلك ، هناك دلفي وعينة شملت لشرح كيفية استخدامها.

تحميل DLLs من الموارد من الذاكرة

إذا تم تخزين DLL تجريبي كمورد باستخدام ملف RC:

DemoDLL RCDATA DemoDLL.dll
فار
ms: TMemoryStream؛
rs: TResourceStream؛
ابدأ
إذا 0 <> FindResource (hInstance ، "DemoDLL" ، RT_RCDATA) ثم
ابدأ
rs: = TResourceStream. إنشاء (hInstance ، 'DemoDLL' ، RT_RCDATA) ؛
ms: = TMemoryStream. خلق؛
محاولة
السيدة. LoadFromStream (rs) ؛
السيدة. الموقف: = 0 ؛
m_DllDataSize: = مللي ثانية. بحجم؛
mp_DllData: = GetMemory (m_DllDataSize) ؛
السيدة. قراءة (mp_DllData ^ ، m_DllDataSize) ؛
أخيرا
السيدة. مجانا؛
روبية مجانا؛
النهاية;
النهاية;
النهاية;
فار
btMM: PBTMemoryModule ؛
ابدأ
btMM: = BTMemoryLoadLibary (mp_DllData، m_DllDataSize)؛
محاولة
إذا btMM = لا شيءثم إحباط
m_TestCallstd: = BTMemoryGetProcAddress (btMM ، 'TestCallstd') ؛
إذا كانتm_TestCallstd = لا شيء ، فأجهض
m_TestCallstd ('هذا استدعاء ذاكرة Dll!') ؛
إلا
Showmessage ('حدث خطأ أثناء تحميل 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 لـ Delphi> = 2009"
instagram story viewer