Nouveau

Charger une DLL à partir d'une ressource directement à partir de la mémoire dans les applications Delphi

Charger une DLL à partir d'une ressource directement à partir de la mémoire dans les applications Delphi

Idée d'article de Mark E. Moss

L'article qui explique comment stocker une DLL dans un fichier exe de 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 copie unique 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.

Chargement de DLL à partir de la mémoire

si une DLL stockée dans un RES peut être utilisée sans l'enregistrer au préalable sur le système de fichiers (disque dur)

Selon l'article Chargement d'une DLL à partir de la mémoire par Joachim Bauch, c'est possible.

Voici comment Joachim aborde le problème: Les fonctions de l'API Windows par défaut permettant de charger des bibliothèques externes dans un programme (LoadLibrary, LoadLibraryEx) fonctionnent uniquement avec des fichiers du système de fichiers. Il est donc impossible de charger une DLL à partir de la mémoire. Mais parfois, vous avez exactement besoin de cette fonctionnalité (par exemple, vous ne voulez pas distribuer beaucoup de fichiers ou rendre le désassemblage plus difficile). Les solutions courantes à ces problèmes consistent à écrire d'abord la DLL dans un fichier temporaire, puis à l'importer. Lorsque le programme se termine, le fichier temporaire est supprimé.

Le code dans 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 étendue avec Delphi (et Lazarus) du module de mémoire C ++ 0.0.1 de Joachim Bauch. Le package zip comprend le code source complet Delphi du MemoyModule (BTMemoryModule.pas). De plus, il y a un exemple Delphi et un exemple inclus pour montrer comment l'utiliser.

Chargement de DLL à partir de ressources de la mémoire

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) puis
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 puis Avorter;
@m_TestCallstd: = BTMemoryGetProcAddress (btMM, 'TestCallstd');
si @m_TestCallstd = nil alors Abort;
m_TestCallstd ('Ceci est un appel de la mémoire Dll!');
sauf
Showmessage ('Une erreur est survenue lors du chargement de la dll:' + BTMemoryGetLastError);
fin;
si Assigné (btMM) puis BTMemoryFreeLibrary (btMM);
fin;
  1. Avoir / Créer une DLL
  2. Stocker la DLL dans un fichier RES
  3. Avoir l'implémentation de BTMemoryModule.
  4. Saisissez la DLL de la ressource et chargez-la directement dans la mémoire.
  5. Utilisez les méthodes BTMemoryModule pour exécuter la procédure à partir de la DLL en mémoire.

BTMemoryLoadLibary in Delphi 2009, 2010,…

"Le fichier BTMemoryModule.pas lié ne fonctionne pas avec Delphi 2009 (et je suppose que Delphi 2010 est également).
J'ai trouvé une version similaire du fichier BTMemoryModule.pas il y a quelque temps et apporté des modifications pour qu'il fonctionne (au moins) avec Delphi 2006, 2007 et 2009. Mon BTMemoryModule.pas mis à jour et un exemple de projet se trouvent sur BTMemoryLoadLibary pour Delphi> = 2009 "