Идея за статия от Марк Д. мъх
Статията как да съхранявате DLL във файла exe на програма Delphi като ресурс обяснява как да изпратите DLL с изпълним файл на приложението Delphi като ресурс.
Динамични библиотеки за връзки съдържат споделяем код или ресурси, те предоставят възможност на множество приложения да споделят едно копие на рутина (или ресурс), които имат общо.
Използвайки ресурсни (.RES) файлове, можете да вграждате (и използвате) звукови файлове, видеоклипове, анимации и по-общо всякакъв вид двоични файлове в изпълним файл на Delphi.
Зареждане на DLL файлове от паметта
ако DLL, съхраняван във ВЕИ, може да се използва, без първо да го запазите във файловата система (твърд диск)
Според статията Зареждане на DLL от паметта от Йоахим Баух, това е възможно.
Ето как Йоахим гледа на проблема: Функциите на API на Windows по подразбиране за зареждане на външни библиотеки в програма (LoadLibrary, LoadLibraryEx) работят само с файлове във файловата система. Следователно е невъзможно да заредите DLL от паметта. Но понякога се нуждаете точно от тази функционалност (например не искате да разпространявате много файлове или искате да направите разглобяването по-трудно). Често срещаните решения на тези проблеми са първо да запишете DLL във временен файл и да го импортирате от там. Когато програмата се прекрати, временният файл се изтрива.
Кодът в споменатата статия е C ++, следващата стъпка беше да го преобразувате в Delphi. За щастие, това вече е направено от Мартин Офенвангер (авторът на DSPlayer).
Модул памет от Martin Offenwanger е разширена съвместима версия на Delphi (както и Lazarus) на C ++ на Йоахим Баух Модул памет 0.0.1. Пакетът с цип включва пълния изходен код на Delphi на MemoyModule (BTMemoryModule.pas). Освен това има включен Delphi и проба, която да демонстрира как да го използвате.
Зареждане на DLL файлове от ресурси от паметта
Ако демо DLL се съхранява като ресурс, използвайки RC файла:
DemoDLL RCDATA DemoDLL.dll
Var
ms: TMemoryStream;
rs: TResourceStream;
започвам
ако 0 <> FindResource (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 = нула, тогава прекъснете;
m_TestCallstd („Това е разговор за памет на Dll!“);
с изключение
Showmessage ('Грешка, възникнала при зареждане на dll:' + BTMemoryGetLastError);
край;
ако Присвоен (btMM) тогава BTMemoryFreeLibrary (btMM);
край;
- Имате / създайте DLL
- Съхранявайте DLL във ВЕИ файл
- Have Внедряване на BTMemoryModule.
- Вземете DLL от ресурса и го заредете директно в паметта.
- Използвайте методите на BTMemoryModule, за да изпълните процедура от DLL в паметта.
BTMemoryLoadLibary в Delphi 2009, 2010,...
Преди време намерих подобна версия на файла BTMemoryModule.pas и направих промени, така че да работи с (поне) Delphi 2006, 2007 и 2009. Моят актуализиран BTMemoryModule.pas и примерен проект са в BTMemoryLoadLibary за Delphi> = 2009"