Utiliser une dll incluse en ressources

Soyez le premier à donner votre avis sur cette source.

Vue 6 805 fois - Téléchargée 1 220 fois

Description

Suite à une question dans le forum de Kopierreko, je dépose cette source. Elle permet d'utiliser une DLL qui a été incluse dans l'application sous forme de ressources (notez que c'est légèrement paradoxal car ça va à l'encontre du concept de la DLL ...).
Dans l'exemple, la DLL est chargée dans le fichier ressource "DLLRes.res". Elle contient 2 fonctions : ShowAMessage (qui affiche un message en prenant en paramètre une chaîne), et "MakeABeep", qui effectue un bip sur le haut-parleur (pas de paramètres). Chez moi, le bip ne marche pas mais je suis sous Vista donc je ne peux pas dire si c'est la fonction qui échoue ou mon ordi qui veut pas ...

/!\ Attention ! L'unité ne permet que d'extraire la DLL et de récupérer sous forme de pointeur les fonctions et procédures ! Il faudra déclarer un type fonction/procédure pour chaque type de fonction/procédure compris dans la DLL. Par exemple, si une DLL contient les fonctions :

procedure FaireQuelqueChose(Parametre: Integer);
function FaireAutreChose(Parametre: Integer): Pointer;
function FaireEncoreAutreChose: Boolean;
function FaireUneDerniereChose(Parametre: Integer): Pointer;

Il faudra déclarer les types suivants :

TNomType1 = procedure(Parametre: Integer); // Pour la première procédure
TNomType2 = function(Parametre: Integer): Pointer; // Pour la deuxième et dernière fonction
TNomType3 = function: Boolean; // Pour la troisième fonction

Source / Exemple :


// In the zip

Conclusion :


Voilà tous commentaires, remarques, critiques, etc ...

Cordialement, Bacterius !

PS : codé sous Delphi 6 Personal Edition.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
J'ai déjà vu la source que tu passes en lien. Ca n'a pas beaucoup d'intérêt ... à part incruster son hook souris/clavier dans son appli sans avoir une DLL qui traîne derrière, ça va à l'encontre du concept de DLL. Et puis les DLL, c'est aussi fait pour pouvoir mettre à jour le core d'une application sans avoir à la dedistribuer : on redistribue la DLL et c'est fait :)
Et ça permet aux g33k5 de fouiner des les fonctions de nos DLL lol

Cordialement, Bacterius !
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Quelques remarques, en vrac, si tu as du temps:

+le champ FProcAddresses est inutile, puisque l'objet TStringList permet de stocker un object associé à chaque chaine. Pour ajouter une paire (nom/pointeur de procédure) dans la liste il suffit de faire FProcNames.AddObject(MyName,TObject(MyPointer)). Inversement, pour récupérer le pointeur on fait Pointer(FProcNames.Objects[Index]).

+Dans le même registre, mettre FProcNames.Sorted:=True dans le constructeur. L'algo dichotomique codé par Borland derrière IndexOf est en O(Log(n)) dans ce cas, au lieu de la méthode en O(n) pour les listes non classées. En outre, il faudrait aussi mettre FProcNames.CaseSensitive=False, puisque je crois que GetProcAddress ne différentie pas les majuscules des minuscules (à vérifier sur MSDN)

+Tu pourrais mettre la DLL dans un fichier temporaire que tu effaces juste après FreeLibrary. Au fait, le nom de fichier chargé par LoadLibrary n'a pas besoin nécessairement de se terminer par '.dll' :-) Peut-être qu'il faudrait une propriété FileName en plus à ton objet pour permettre d'utiliser un autre nom de fichier (pour éviter une éventuelle collision). Du genre, par défaut si la propriété vaut '' ça utilise un nom de fichier temporaire (il y a une API Microsoft pour générer un tel nom qui évite les collisions) sinon ça utilise le nom explicite fourni.

+Plus difficile: tu pourrais faire (en plus) un composant utilisant ta classe, avec un stream qui s'enregistre dans le .DFM (il faut surcharger la méthode DefineProperties) et avec un éditeur de propriété qui custom permettant de choisir un fichier DLL (local) en passant par l'inspecteur d'objet. Ça permettrait aux gens allergiques aux lignes de commande (nécessaire pour compiler les resources dans le .RES) de pouvoir utiliser ton système très facilement juste en passant par le designer visuel de Delphi (l'inconvénient c'est que la resource est chargée dès la création du composant).
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Oui tu as raison, ce n'est pas pas forcément "paradoxal". Mais je dis ça dans en me disant que la DLL est par définition une "extension de l'application", par conséquent est donc créée pour alléger l'application et pour éviter de devoir recoder des routines triviales (va donc réécrire Shell32.dll et User32.dll à chaque fois que tu veux créer une fiche ! :p).

L'originalité, ce n'est pas de moi, c'est suite à une question sur le forum, dont j'aurai dû préciser l'adresse :

Sinon, que dis-tu que l'except est silencieux ? J'aurai dû effectivement le tester, tu as raison, l'except ne sert à rien, merci de ton aide.

Sinon, si tu connais une méthode pour extraire les paramètres d'une fonction contenue dans une DLL ? J'avais lu que c'est impossible, mais ... on ne sait jamais ... comme ça ça éviterait de devoir passer par un type procédural (type TProcedure = procedure(...Parametres...) dans la plupart des cas ?

Cordialement, Bacterius !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.