Cargar una DLL desde un recurso directamente desde la memoria en aplicaciones Delphi

Idea del artículo de Mark E. Moss

El artículo sobre cómo almacenar una DLL dentro de un archivo exe del programa Delphi como recurso explica cómo enviar una DLL con el archivo ejecutable de su aplicación Delphi como recurso.

Las bibliotecas de enlaces dinámicos contienen código o recursos compartibles, proporcionan la capacidad para que múltiples aplicaciones compartan una sola copia de una rutina (o recurso) que tienen en común.

Usando archivos de recursos (.RES), puede incrustar (y usar) archivos de sonido, videoclips, animaciones y, en general, cualquier tipo de archivos binarios en un ejecutable de Delphi.

Carga de archivos DLL desde la memoria

si se puede usar un archivo DLL almacenado en un RES sin guardarlo primero en el sistema de archivos (disco duro)

Según el artículo Cargando una DLL de la memoria de Joachim Bauch, esto es posible.

Así es como Joachim ve el problema: Las funciones predeterminadas de la API de Windows para cargar bibliotecas externas en un programa (LoadLibrary, LoadLibraryEx) solo funcionan con archivos en el sistema de archivos. Por lo tanto, es imposible cargar una DLL desde la memoria. Pero a veces, necesita exactamente esta funcionalidad (por ejemplo, no desea distribuir muchos archivos o hacer que el desmontaje sea más difícil). Las soluciones comunes para estos problemas son escribir primero la DLL en un archivo temporal e importarla desde allí. Cuando el programa finaliza, el archivo temporal se elimina.

El código en el artículo mencionado es C ++, el siguiente paso fue convertirlo a Delphi. Afortunadamente, esto ya lo hizo Martin Offenwanger (el autor de DSPlayer).

El módulo de memoria de Martin Offenwanger es una versión extendida compatible con Delphi (y también Lazarus) del módulo de memoria C ++ 0.0.1 de Joachim Bauch. El paquete zip incluye el código fuente completo de Delphi del MemoyModule (BTMemoryModule.pas). Además, se incluye un Delphi y una muestra para demostrar cómo usarlo.

Carga de archivos DLL desde recursos desde la memoria

Si una DLL de demostración se almacena como un recurso utilizando el archivo RC:

DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
empezar
Si 0 FindResource (hInstance, 'DemoDLL', RT_RCDATA) luego
empezar
rs: = TResourceStream.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
tratar
ms.LoadFromStream (rs);
ms.Position: = 0;
m_DllDataSize: = ms.Size;
mp_DllData: = GetMemory (m_DllDataSize);
ms.Read (mp_DllData ^, m_DllDataSize);
finalmente
ms.Free;
rs.Free;
final;
final;
final;
var
btMM: PBTMemoryModule;
empezar
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
tratar
si btMM = nulo luego Abortar;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
if @m_TestCallstd = nil entonces Abortar;
m_TestCallstd ('¡Esta es una llamada de memoria Dll!');
excepto
Showmessage ('Se produjo un error al cargar el archivo dll:' + BTMemoryGetLastError);
final;
Si Asignado (btMM) luego BTMemoryFreeLibrary (btMM);
final;
  1. Tener / Crear una DLL
  2. Almacene la DLL en un archivo RES
  3. Tener implementación de BTMemoryModule.
  4. Tome la DLL del recurso y cárguela directamente en la memoria.
  5. Use los métodos BTMemoryModule para ejecutar el procedimiento desde la DLL en la memoria.

BTMemoryLoadLibary en Delphi 2009, 2010,…

"El BTMemoryModule.pas vinculado no funciona con Delphi 2009 (y supongo que Delphi 2010 también).
Encontré una versión similar del archivo BTMemoryModule.pas hace un tiempo, e hice cambios para que funcione con (al menos) Delphi 2006, 2007 y 2009. Mi BTMemoryModule.pas actualizado y un proyecto de muestra están en BTMemoryLoadLibary para Delphi> = 2009 "