Идея статьи Марка Э. Мох
В статье о том, как хранить DLL в исполняемом файле программы Delphi в качестве ресурса, объясняется, как доставить DLL вместе с исполняемым файлом приложения Delphi в качестве ресурса.
Библиотеки динамических ссылок содержат разделяемый код или ресурсы, они дают возможность нескольким приложениям совместно использовать одну копию подпрограммы (или ресурса), которую они имеют совместно.
С помощью файлы ресурсов (.RES)Вы можете вставлять (и использовать) звуковые файлы, видеоклипы, анимацию и, в более общем смысле, любые двоичные файлы в исполняемый файл Delphi.
Загрузка DLL из памяти
можно ли использовать DLL, хранящуюся в RES, без предварительного сохранения в файловой системе (на жестком диске)
Согласно статье Загрузка DLL из памяти Иоахим Баух, это возможно.
Вот как Иоахим смотрит на проблему: Функции Windows API по умолчанию для загрузки внешних библиотек в программу (LoadLibrary, LoadLibraryEx) работают только с файлами в файловой системе. Поэтому невозможно загрузить DLL из памяти. Но иногда вам нужна именно эта функциональность (например, вы не хотите распространять много файлов или хотите усложнить разборку). Обычные обходные пути для этой проблемы - сначала записать DLL во временный файл и импортировать его оттуда. Когда программа завершается, временный файл удаляется.
Код в упомянутой статье - C ++, следующим шагом было преобразование его в Delphi. К счастью, это уже сделал Мартин Оффенвангер (автор DSPlayer).
Модуль памяти Martin Offenwanger - расширенная Delphi (а также Lazarus) совместимая версия C ++ Иоахима Бауха Модуль памяти 0.0.1. В zip-пакет входит полный исходный код Delmo для MemoyModule. (BTMemoryModule.pas). Кроме того, есть Delphi и пример, включенный, чтобы продемонстрировать, как его использовать.
Загрузка DLL из ресурсов из памяти
Если демонстрационная 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);
наконец
Миз. Свободно;
RS. Свободно;
конец;
конец;
конец;
вар
btMM: PBTMemoryModule;
начать
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
пытаться
если btMM = нольтогда Прервать;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
если @m_TestCallstd = nil, то Abort;
m_TestCallstd («Это вызов памяти Dll!»);
Кроме
Showmessage ('Ошибка при загрузке DLL:' + BTMemoryGetLastError);
конец;
если Назначено (бтММ) тогда BTMemoryFreeLibrary (btMM);
конец;
- Иметь / Создать DLL
- Сохраните DLL в файле RES
- Есть Реализация BTMemoryModule.
- Возьмите DLL из ресурса и загрузите ее прямо в память.
- Используйте методы BTMemoryModule для выполнения процедуры из DLL в памяти.
BTMemoryLoadLibary в Delphi 2009, 2010,...
Некоторое время назад я нашел похожую версию файла BTMemoryModule.pas и внес изменения, чтобы он работал (по крайней мере) с Delphi 2006, 2007 и 2009. Мой обновленный BTMemoryModule.pas и пример проекта находятся по адресу BTMemoryLoadLibary для Delphi> = 2009"