UTILISER UNE DLL INCLUSE EN RESSOURCES

VoicedMirror Messages postés 5 Date d'inscription samedi 28 octobre 2000 Statut Membre Dernière intervention 21 octobre 2009 - 16 sept. 2009 à 23:04
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 - 18 sept. 2009 à 08:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50574-utiliser-une-dll-incluse-en-ressources

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
18 sept. 2009 à 08:23
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 !
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
17 sept. 2009 à 14:08
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).
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
17 sept. 2009 à 06:01
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 !
Rejoignez-nous