IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Interface et BPL dans D7


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 386
    Points : 2 999
    Points
    2 999
    Par défaut Interface et BPL dans D7
    Bonjour

    J'ai un BPL dans lequel j'ai mis une classe commuit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      IMailer = interface
        ['{EB65DF3D-2E52-4064-945B-5751D197201F}']
        procedure EnvoiMail(Destinataires: string; Fichiers: TStringList);
      end;
     
      TMailer = Class(TInterfacedObject, IMailer)
        Procedure EnvoiMail(Destinataires : String; Fichiers : TStringList);
      End;
    Dans mon exe, je charge le BPL dynamiquement et je veux utiliser mon IMailer.
    Mon interface est dans un fichier séparé bien sur et inclus aussi bien dans le bpl que dans l'exe.

    Pour obtenir une instace d'IMailer dans mon exe, je me suis résolu à passer par une fonction que j'exporte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function GetMailer : IMailer;
    Begin
      Result := TMailer.Create;
    End;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    var
      FMailer: IMailer;
      PackageModule: HModule;
     
    function GetMailer: IMailer;
    var
      MailerCreator: TMailer;
    begin
      Result := nil;
      if PackageModule = 0 then
        PackageModule := LoadPackage(BPLName);
     
      if PackageModule <> 0 then
      begin
        @MailerCreator := GetProcAddress(PackageModule, 'GetMailer');
        if Assigned(MailerCreator) then
          Result := MailerCreator;
      end;
    end;
    Parce que GetClass ne fonctionne qu'avec des TPersistentClass.

    Est-ce que je pourrais faire autrement et me passer de cette fonction ?
    Un équivalent à GetClass que je ne connaitrais pas ?

    Merci d'avance de vos lumières

    Papy !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 454
    Points : 24 866
    Points
    24 866
    Par défaut
    Personnellement, je ne vois pas ce qui peut exister autre que GetClass côté appelant et RegisterClass côté BPL
    le BPL est conçu pour échanger des classes Delphi ce que l'on ne peut pas faire avec une DLL (en fait si, mais faut tricher en créant aussi la factory)
    Pour les interfaces, on peut le faire avec une DLL et même un autre langage via le COM

    Après tout une interface peut-être implémentée de plusieurs façon,
    la méthode habituelle est d'utiliser une Factory (voir le modèle COM par exemple) pour instancier un objet qui implémente la classe de demandée

    Ta méthode GetMailer est une factory ultra simpliste mais c'est son but !

    En C++Builder 2007, c'est ainsi que j'avais procédé !
    J'avais plusieurs DLL (sorte de driver, une DLL par fabricant de matériel),
    toutes fournissant une toute petite série de procédure exportée (GetProvider, GetLastError...)

    Le GetProvider me fournissait l'objet principal de la DLL sous la forme d'un IShaiHardwareProvider,
    ce dernier me renvoyait ensuite un IShaiHardwareModelList, tableau de IShaiHardwareModel
    ainsi je pouvais avoir dans une seule DLL différente implémentation de protocole matériel pour un même fabricant
    IShaiHardwareModel me proposait enfin une méthode CreateEntity (la factory) renvoyant un IShaiHardwareEntity
    après ce n'était plus que du Supports sur plus de 200 interfaces (un peu comme dans FMX TPlatformServices)

    Si tu prévois d'enrichir ton BPL avec un grand nombre de fonctionnalité avec des interfaces
    tu pourrais procéder d'une façon similaire, une interface racine est le point d'entrée te fournissant une fabrique sur l'une ou l'autre fonctionnalité proposer par le BPL chargé

    Au final, ça se la même chose, soit plein de fonction exportée,
    soit un code de fabrique certe plus "POO" mais nettement plus compliqué
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 386
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut Shaï,

    Réponse un peu tardive pour cause de problème bizarre avec D7. Dès que j'ajoute un composant TTable au BPL, plantage à l'exécution avec un message disant que l'application n'a pas la licence nécessaire pour cette fonctionnalité. Jamais vu un message comme ça et j'ai pas pu le résoudre. Du coup, je passe par une dll qui ne pose pas de problème.

    Sinon, je me doutais un peu qu'il n'y avait pas d'autre solution. Ma mini factory semble donc la seule solution même si elle impose un exports.
    Le point d'entrée unique est une idée intéressante qui me permetrait effectivement de limiter les exports inutiles.
    Pour le moment, les fonctionnalités seront réduites mais ça risque de grandir avec le temps.

    Merci de tes conseils

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Pourquoi utiliser un paquet si c'est pour faire un chargement et utiliser une interface ?! une DLL me semble plus indiquée...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 386
    Points : 2 999
    Points
    2 999
    Par défaut
    Parce que le bpl me permet de passer des objets plus facilement, des TStringList par exemple.
    Ça me paraissait plus intégré qu'une dll.
    Mais au bout du compte, j'ai du me résoudre à la dll à cause du problème évoqué .

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 454
    Points : 24 866
    Points
    24 866
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    plantage à l'exécution avec un message disant que l'application n'a pas la licence nécessaire pour cette fonctionnalité. Jamais vu un message comme ça et j'ai pas pu le résoudre. Du coup, je passe par une dll qui ne pose pas de problème.
    Dans une version Pro, c'est lorsque l'on utilise plusieurs drivers DB
    Je ne l'ai vu qu'avec DBX en utilisant à la fois le driver Sybase ASA et le driver ODBC

    Pour la TStringList, tu peux aussi l'échanger par une DLL, c'est juste qu'il faut la gérer en lecture seule (ce qui n'est pas évident)
    Et rien n'empêche de faire une IStrings échangée entre DLL et EXE, qui est implémentée par une TStringList ou un autre TStrings côté DLL
    Et depuis l'EXE, tu te fais une classe qui permet de charger une TStrings depuis une IStrings lorsque le type TStrings est nécessaire !

    Pense que tu peux aussi utiliser le PChar avec des doublons zéro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Chaine1'#0'Chaine2'#0'Chaine3'#0#0
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 386
    Points : 2 999
    Points
    2 999
    Par défaut
    Dans une version Pro, c'est lorsque l'on utilise plusieurs drivers DB
    Je ne l'ai vu qu'avec DBX en utilisant à la fois le driver Sybase ASA et le driver ODBC
    Pourtant, je n'ai posé qu'un seul composant TTable lié à un fichier paradox.
    J'ai essayé par curiosité avec un composant ADO et j'ai eu le même résultat.
    Et je n'ai rien trouvé sur le net qui donne une solution à ce problème.

    Pour la TStringList, tu peux aussi l'échanger par une DLL, c'est juste qu'il faut la gérer en lecture seule (ce qui n'est pas évident)
    Là, ça mi'rait puisqu'il s'agirait par exemple de transmettre une liste de noms de fichiers à envoyer par mail.

    Et rien n'empêche de faire une IStrings échangée entre DLL et EXE, qui est implémentée par une TStringList ou un autre TStrings côté DLL
    Et depuis l'EXE, tu te fais une classe qui permet de charger une TStrings depuis une IStrings lorsque le type TStrings est nécessaire !
    Intéressant ! Le retard pris à cause de ces petits soucis va malheureusement m'interdire de faire des modifs maintenant mais ça me fera un bon sujet pour un w-e pluvieux :-)

Discussions similaires

  1. interfaces a integrer dans le code
    Par pepito31 dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 16/06/2007, 21h29
  2. Réponses: 4
    Dernier message: 07/05/2007, 21h38
  3. Inclure les BPL dans le .EXE ??
    Par syntage dans le forum Delphi
    Réponses: 6
    Dernier message: 01/06/2006, 17h13
  4. [FPDF] interface pdf intégrée dans une page web ?
    Par abstractor77 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/02/2006, 12h36
  5. interface pour séléction dans un query
    Par Bernard123 dans le forum Access
    Réponses: 3
    Dernier message: 27/09/2005, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo