मेमोरी से सीधे संसाधन से DLL लोड करें

मार्क ई द्वारा लेख विचार। काई

एक डेल्फी प्रोग्राम exe फ़ाइल के अंदर एक DLL को एक संसाधन के रूप में संग्रहित करने का लेख बताता है कि एक DLL को अपने डेल्फी एप्लिकेशन निष्पादन योग्य फ़ाइल के साथ संसाधन के रूप में कैसे शिप करें।

डायनेमिक लिंक लाइब्रेरी साझा करने योग्य कोड या संसाधन होते हैं, वे एक सामान्य (या संसाधन) की एक प्रतिलिपि को साझा करने के लिए कई अनुप्रयोगों की क्षमता प्रदान करते हैं।

का उपयोग करते हुए संसाधन (.RES) फाइलें, आप एक डेल्फी निष्पादन योग्य में ध्वनि फ़ाइलों, वीडियो क्लिप, एनिमेशन और अधिक आम तौर पर किसी भी प्रकार की बाइनरी फ़ाइलों को एम्बेड (और उपयोग) कर सकते हैं।

मेमोरी से DLL लोड हो रहा है

यदि किसी RES में संग्रहित DLL को पहले फ़ाइल सिस्टम (हार्ड डिस्क) पर सहेजे बिना उपयोग किया जा सकता है

लेख के अनुसार मेमोरी से DLL लोड हो रहा है जोआचिम बाउच द्वारा, यह संभव है।

यहाँ कैसे जोआचिम इस मुद्दे को देखता है: डिफ़ॉल्ट विंडोज़ एपीआई एक प्रोग्राम में बाहरी पुस्तकालयों को लोड करने के लिए कार्य करता है (लोडलॉउंड, लोडलॉन्डेक्स) केवल फाइल सिस्टम पर फाइलों के साथ काम करता है। इसलिए मेमोरी से DLL लोड करना असंभव है। लेकिन कभी-कभी, आपको वास्तव में इस कार्यक्षमता की आवश्यकता होती है (उदाहरण के लिए, आप बहुत सारी फ़ाइलों को वितरित नहीं करना चाहते हैं या असंतुष्ट को कठिन बनाना चाहते हैं)। इस समस्याओं के लिए सामान्य वर्कअराउंड डीएलएल को पहले एक अस्थायी फ़ाइल में लिखना है और इसे वहां से आयात करना है। जब प्रोग्राम समाप्त हो जाता है, तो अस्थायी फ़ाइल हटा दी जाती है।

instagram viewer

उल्लिखित लेख का कोड C ++ है, अगला चरण इसे डेल्फी में परिवर्तित करना था। सौभाग्य से, यह पहले से ही मार्टिन ऑफेनवांगर (के लेखक द्वारा किया गया है) DSPlayer).

मेमोरी मॉड्यूल मार्टिन ऑफेनवांगर एक विस्तारित डेल्फी (और लाजर भी है) जोआचिम बाउच के सी ++ का संगत संस्करण है मेमोरी मॉड्यूल 0.0.1। ज़िप पैकेज में मेमॉयमॉड्यूल का पूरा डेल्फी स्रोत कोड शामिल है (BTMemoryModule.pas)। इसके अलावा एक डेल्फी और नमूना शामिल है कि इसे कैसे उपयोग किया जाए।

मेमोरी से संसाधन से DLL लोड हो रहा है

यदि RC DL फ़ाइल का उपयोग करते हुए डेमो DLL को संसाधन के रूप में संग्रहीत किया जाता है:

DemoDLL RCDATA डेमोDLL.dll
वर
एमएस: टीमेमोरीस्ट्रीम;
rs: TResourceStream;
शुरू
अगर 0 <> FindResource (hInstance, 'DemoDLL', RT_RCDATA) फिर
शुरू
rs: = TResourceStream बनाएँ (hInstance, 'DemoDLL', RT_RCDATA);
एमएस: = टीमेमोरीस्ट्रीम। सृजन करना;
प्रयत्न
सुश्री। लोडफ्रेमस्ट्रीम (आरएस);
सुश्री। पद: = 0;
m_DllDataSize: = ms। आकार;
mp_DllData: = GetMemory (m_DllDataSize);
सुश्री। पढ़ें (mp_DllData ^, m_DllDataSize);
आखिरकार
सुश्री। नि: शुल्क;
रु। नि: शुल्क;
समाप्त;
समाप्त;
समाप्त;
वर
btMM: PBTMemoryModule;
शुरू
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
प्रयत्न
अगर बीटीएमएम = शून्यफिर बीच में बंद करें;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
अगर @m_TestCallstd = nil तो Abort;
m_TestCallstd ('यह एक Dll मेमोरी कॉल है!');
के सिवाय
दिखावा ('dll लोड करते समय एक त्रुटि हुई:' + BTMemoryGetLastError);
समाप्त;
अगर सौंपा (बीटीएमएम) फिर BTMemoryFreeLibrary (btMM);
समाप्त;
  1. एक DLL बनाएं / बनाएं
  2. DLL को RES फ़ाइल में स्टोर करें
  3. Have BTMemoryModule कार्यान्वयन.
  4. संसाधन से DLL को पकड़ो और इसे सीधे मेमोरी में लोड करें।
  5. मेमोरी में DLL से प्रक्रिया निष्पादित करने के लिए BTMemoryModule विधियों का उपयोग करें।

डेल्फी 2009, 2010 में BTMemoryLoadLibary,...

"लिंक्ड BTMemoryModule.pas डेल्फी 2009 के साथ काम नहीं करता है (और मैं डेल्फी 2010 को भी मानूंगा)।
मुझे कुछ समय पहले BTMemoryModule.pas फ़ाइल का एक समान संस्करण मिला, और इसमें बदलाव किए गए (कम से कम) डेल्फी 2006, 2007 और 2009 के साथ काम करता है। मेरे अपडेट किए गए BTMemoryModule.pas, और एक नमूना परियोजना, पर हैं डेल्फी के लिए BTMemoryLoadLibary> = 2009"