8
votes

Comment appelle-t-je les fonctions DELPHI dans un BPL d'un exécutable?

J'ai une application Delphi que j'ai écrit un wrapper assez simple .exe pour.

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.

Eh bien, cette DLL est un BPL, et je ne sais pas comment appeler des fonctions dans ce fichier. Merci d'avance.


0 commentaires

3 Réponses :


2
votes

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.


8 commentaires

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



1
votes

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.


2 commentaires

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.



10
votes

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:

  1. Votre projet doit utiliser la même version Delphi que celle utilisée pour compiler le package.
  2. Vous devez avoir accès au fichier DCU pour l'appareil ou au moins le fichier DCP pour le package.
  3. Le paquet doit exister dans le chemin de recherche du système d'exploitation lorsque votre programme commence.

    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 loadpackage pour cela. La façon de faire ce travail est d'avoir un autre paquet est 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.

    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 LoadLibrary . Utilisez GETPROCADDRESS Pour charger son Initialiser la fonction , puis l'appelez. (N'oubliez pas que la convention appelante est enregistrer , pas stdcall .) 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 avant d'appeler freeelibrary . Vérifiez la source pour loadpackage et déchargement ; Si vous devez appeler checkforduplicateunits dépend probablement de savoir si vous pouvez satisfaire l'exigence numéro 1.


2 commentaires

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.