Cargar una DLL desde un recurso directamente desde la memoria

click fraud protection

Idea de artículo de Mark E. Musgo

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 la aplicación Delphi como recurso.

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.

Utilizando archivos de recursos (.RES), puede incrustar (y usar) archivos de sonido, videoclips, animaciones y, más generalmente, 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)

Segun el articulo Cargando una DLL desde la memoria por 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.

instagram viewer

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).

Módulo de memoria por Martin Offenwanger es una versión extendida compatible con Delphi (y también Lazarus) de C ++ de Joachim Bauch Módulo de memoria 0.0.1. El paquete zip incluye el código fuente completo de Delphi del MemoyModule (BTMemoryModule.pas). Además, hay un Delphi y una muestra incluidos 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. Crear (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Crear;
tratar
Sra. LoadFromStream (rs);
Sra. Posición: = 0;
m_DllDataSize: = ms. Talla;
mp_DllData: = GetMemory (m_DllDataSize);
Sra. Leer (mp_DllData ^, m_DllDataSize);
finalmente
Sra. Gratis;
rs. Gratis;
final;
final;
final;
var
btMM: PBTMemoryModule;
empezar
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
tratar
si btMM = nuloluego 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. Utilice 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"
instagram story viewer