Charger une DLL à partir d'une ressource directement à partir de la mémoire

click fraud protection

Idée d'article par Mark E. Mousse

L'article 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.

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 fichiers de ressources (.RES), vous pouvez intégrer (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 d'abord l'enregistrer 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 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é.

instagram viewer

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

Module de mémoire de Martin Offenwanger est une version compatible Delphi étendue (et aussi Lazarus) du C ++ de Joachim Bauch Module de mémoire 0.0.1. 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.

Chargement de DLL à partir de ressources depuis 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) ensuite
commencer
rs: = TResourceStream. Créer (hInstance, 'DemoDLL', RT_RCDATA);
ms: = TMemoryStream. Créer;
essayer
Mme. LoadFromStream (rs);
Mme. Position: = 0;
m_DllDataSize: = ms. Taille;
mp_DllData: = GetMemory (m_DllDataSize);
Mme. Lire (mp_DllData ^, m_DllDataSize);
enfin
Mme. Gratuit;
rs. Gratuit;
fin;
fin;
fin;
var
btMM: PBTMemoryModule;
commencer
btMM: = BTMemoryLoadLibary (mp_DllData, m_DllDataSize);
essayer
si btMM = néantensuite 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;
  1. Avoir / créer une DLL
  2. Stockez la DLL dans un fichier RES
  3. Avoir Implémentation de BTMemoryModule.
  4. Saisissez la DLL de la ressource et chargez-la directement en mémoire.
  5. Utilisez les méthodes BTMemoryModule pour exécuter la procédure à partir de la DLL en mémoire.

BTMemoryLoadLibary dans Delphi 2009, 2010,...

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