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