L'article comment stocker une DLL dans un fichier exe du programme Delphi en tant que ressource explique comment expédier une DLL avec votre fichier exécutable d'application Delphi en tant que ressource.
Les bibliothèques de liens dynamiques contiennent du code ou des ressources partageables, elles permettent à plusieurs applications de partager une seule copie d'une routine (ou d'une ressource) qu'elles ont en commun.
En utilisant des fichiers de ressources (.RES), vous pouvez incorporer (et utiliser) des fichiers audio, des clips vidéo, des animations et plus généralement tout type de fichiers binaires dans un exécutable Delphi.
Selon l'article Chargement d'une DLL à partir de la mémoire par Joachim Bauch, cela est possible.
Voici comment Joachim regarde le problème: Les fonctions de l'API Windows par défaut pour charger des bibliothèques externes dans un programme (LoadLibrary, LoadLibraryEx) ne fonctionnent qu'avec des fichiers sur le système de fichiers. Il est donc impossible de charger une DLL depuis la mémoire. Mais parfois, vous avez besoin exactement de cette fonctionnalité (par exemple, vous ne voulez pas distribuer beaucoup de fichiers ou rendre le démontage plus difficile). Les solutions de contournement courantes à ces problèmes consistent à écrire d'abord la DLL dans un fichier temporaire et à l'importer à partir de là. À la fin du programme, le fichier temporaire est supprimé.
Le code de l'article mentionné est C ++, l'étape suivante consistait à le convertir en Delphi. Heureusement, cela a déjà été fait par Martin Offenwanger (l'auteur de DSPlayer).
Memory Module de Martin Offenwanger est une version compatible Delphi étendue (et aussi Lazarus) du module mémoire C ++ 0.0.1 de Joachim Bauch. Le package zip inclut le code source Delphi complet du MemoyModule (BTMemoryModule.pas). De plus, il y a un Delphi et un échantillon inclus pour montrer comment l'utiliser.
Si une DLL de démonstration est stockée en tant que ressource à l'aide du fichier RC:
DemoDLL RCDATA DemoDLL.dll
var
ms: TMemoryStream;
rs: TResourceStream;
commencer
si 0 FindResource (hInstance, 'DemoDLL', RT_RCDATA) ensuite
commencer
rs: = TResourceStream.Create (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream.Create;
essayer
ms.LoadFromStream (rs);
ms.Position: = 0;
m_DllDataSize: = ms.Size;
mp_DllData: = GetMemory (m_DllDataSize);
ms.Read (mp_DllData ^, m_DllDataSize);
enfin
ms.Free;
rs.Free;
fin;
fin;
fin;
var
btMM: PBTMemoryModule;
commencer
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
essayer
si btMM = néant ensuite Avorter;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
si @m_TestCallstd = nil alors Abandonner;
m_TestCallstd ('Ceci est un appel mémoire Dll!');
sauf
Showmessage ('Une erreur s'est produite lors du chargement de la dll:' + BTMemoryGetLastError);
fin;
si Attribué (btMM) ensuite BTMemoryFreeLibrary (btMM);
fin;