J'ai une application Delphi que j'ai écrit un wrapper assez simple .exe pour. p>
Fondamentalement, il y avait une DLL qui avait un tas de fonctions, dont j'appellerais itérativement une fois que mon enveloppe a fait ce qu'il avait besoin. Je ne contrôle pas ce fichier dll et je ne serai jamais. P>
Eh bien, cette DLL est un BPL, et je ne sais pas comment appeler des fonctions dans ce fichier. Merci d'avance. P>
3 Réponses :
Un BPL n'est qu'une DLL avec quelques ajouts spécifiques à celui-ci. Vous ne devriez avoir aucune difficulté à apposer des fonctions à partir de ce que vous avez faite avec la DLL, avec une mise en garde spécifique: le BPL doit être construit dans la même version de Delphi que vous utilisez. Cela peut être un inconvénient majeur si vous n'avez pas le code source. Si tel est un problème pour vous, vous devriez probablement parler avec quiconque l'a créé et leur demander de revenir dans une DLL. P>
-1, je suis fortement en désaccord avec l'idée de «retour à DLL-Hell». Les BPL offrent une interface très riche et une gestion de la mémoire transparente.
Que vous aimez ou non les implications de cela ne changent pas le fait objectif que vous ne pouvez pas charger un BPL à partir d'un exécutable Delphi compilé avec une version différente de Delphi. Si vous connaissez un moyen de le faire, je serais très i> intéressé à savoir comment ...
Les BPLS peuvent certainement être construits avec une autre version Delphi, si l'on colle à l'interface DLL et aux types compatibles DLL (aucune chaîne pour un démarrage).
Oui, mais vous savez ce que je veux dire. Un moyen d'utiliser les fonctionnalités de BPL étendues d'une autre version Delphi. Afaik ça ne peut pas être fait.
Mason, une BPL propose une interface DLL plus, si vous utilisez le bon Delphi, les objets, les interfaces et tous les autres types Delphi. La politique de version de Delphi est un peu douloureuse mais bien connue, juste une mise à niveau ou une dégradation.
Henk: Oui, c'est exactement ce que je disais. Le problème est que l'utilisation d'une BPL fournie par une tierce partie vous laisse attachée à cette version et incapable de mettre à niveau ou de la dégradation que si elles ne le font aussi. C'est pourquoi pourquoi aucun développeur Delphi expérimenté n'utilise par exemple les packages de composants binaires, par exemple.
Henk, simplement utiliser des dlls ne crée pas "DLL HELL". Si c'est le faisait, alors BPLS ne serait pas différent de toute façon, puisqu'ils sont des DLL. L'utilisation de packages ne résout pas aucun des problèmes qui se produisent dans l'enfer DLL. DLL HELL est le problème de la gestion des versions contradictoires d'une DLL dans un seul emplacement d'installation. Vous pouvez aussi facilement avoir des versions contradictoires d'un BPL.
Rob, vous avez raison sur le sens général de DLL-Hell, j'ai utilisé le terme réfléchissant à l'effort nécessaire de transférer une chaîne simple ou une gamme d'enregistrements. Et les BPL résolvent la plupart de ces problèmes de DLL.
Un BPL peut éliminer beaucoup de problèmes de DLL. Si vous pouvez le lier statiquement, la frontière devient tout sauf transparente. Si vous devez le charger de manière dynamique, vous avez besoin d'une fonction d'accès de style DLL (généralement celle qui renvoie un objet ou une interface) et des définitions de type commun (interface). Tout ce qui devrait être fourni par le fabricant de la BPL. P>
Quel serait l'avantage de faire une "DLL qui avait un tas de fonctions, dont j'appellerais" dans un BPL? Aucun des avantages que vous citez semble important pour l'OP. Peut-être qu'il n'a jamais souffert de ces problèmes de DLL non plus?
Dépend des paramètres de cette fonction. Mayb dan peut poster une ligne d'en-tête.
Le moyen facile d'utiliser des fonctions à partir d'un package consiste à "utiliser" l'unité contenant la fonction, appelez-la comme d'habitude et placez le package sur la liste des packages d'exécution de votre projet. Pour que cela fonctionne, il existe quelques exigences: p>
Si vous ne pouvez pas satisfaire la troisième exigence ou si vous ne voulez pas que le colis chargé soit chargé tout le temps, vous pouvez appeler Si vous ne pouvez pas satisfaire les deux premières exigences, il y a beaucoup de choses plus difficiles, ce qui est également ce que vous auriez besoin de faire si votre application n'est pas écrite dans DelphI ou C ++ Builder. Traitez le paquet comme une DLL ordinaire. Chargez-le avec loadpackage code> pour cela. La façon de faire ce travail est d'avoir un autre paquet est em> chargé tout le temps. Il sera utilisé à la fois par votre projet et le forfait que vous souhaitez charger. L'emballage intermédiaire exposera une interface (telle que certaines fonctions d'enregistrement, une variable ou une classe) que l'emballage principal peut utiliser pour indiquer à l'application quelles sont ses fonctions. Vous ne pourrez pas "utiliser" l'unité du paquet principal dans votre application directement. P>
LoadLibrary code>. Utilisez
GETPROCADDRESS CODE> Pour charger son
Initialiser la fonction code>, puis l'appelez. (N'oubliez pas que la convention appelante est
enregistrer code>, pas
stdcall code>.) Puis chargez l'adresse de la fonction que vous souhaitez appeler, gardant à l'esprit que le nom de la fonction a été géré pour inclure une unité et des informations de type. Appelez la fonction
finaliser code> avant d'appeler
freeelibrary code>. Vérifiez la source pour
loadpackage code> et
déchargement code>; Si vous devez appeler
checkforduplicateunits code> dépend probablement de savoir si vous pouvez satisfaire l'exigence numéro 1. P>
Toute façon que vous pouvez me signaler à une ressource pour faire cela? Je ne suis en fait pas un programmeur Delphi, alors je suis une perte pour certaines de ces choses.
Je ne suis au courant d'aucune ressource décrivant comment "manuellement" charger des packages de la manière dont j'ai décrits dans le dernier paragraphe. La manière habituelle d'utiliser des paquets, comme décrit dans l'avant-dernier paragraphe, est quelque chose que je m'attendais à apparaître dans l'aide Delphes, bien que je ne puisse pas me choquer moi-même depuis que je n'ai pas installé Delphi.