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 :

[DLL] Appel d'une frame depuis une DLL


Sujet :

Langage Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut [DLL] Appel d'une frame depuis une DLL
    J'aimerai pouvoir utiliser une frame qu'il y a dans une dll pour l'afficher dans le panel de l'application principale.

    Est on obligé de faire comme la gestion des plugins propsé par le tutoriel ou bien y a t il un facon plus simple de réaliser cela ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Oui et non.
    Ca depends de ce que tu compte faire.

    Si implemente une fonction dans ta dll que tu exporte et qui a pour parametre une variable detype THandle, tu peux a l'aide de "SetPArent(CheildHandle, PArentHandle)" de l'api Windows

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    En clair j'ai une form principale avec un menu qui va s'alimenter selon les dll qui sont dans le répertoire (ca c'est bon j'ai réussi à le faire)
    Quand on cliquera sur un bouton, je voudrais faire apparaitre dans un panel la frame associée à la dll.
    La partie ou je bloque est sur l'affichage de cette frame dans le panel

    J'ai essayé un truc de ce style :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    library TestDll;
     
    uses
      SysUtils,
      Classes,
      ExtCtrls,
      forms,
      uDLLCommun in 'uDLLCommun.pas',
      AboutForm in 'AboutForm.pas' {AboutBox: TFrame};
     
    {$R *.res}
     
    function GetFrame : TFrame;
    begin
      Result.Assign(AboutBox);
    end;
     
    function GetDLLInfo : TInfoDLL;
    var
      InfoDll : TInfoDLL;
    begin
      InfoDll.Name := 'Test1';
      InfoDLL.MenuSection := 'Section 1';
      InfoDll.MenuName := 'BoutonName 2';
      Result := InfoDLL;
    end;
     
    Exports
      GetDLLInfo index 0 name 'GetDLLInfo',
      GetFrame   index 5 name 'GetFrame',
     
    begin
    end.
    et dans mon code

    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
     
    var
      HandleDLL: THandle;
      GetFrame   : function : TFrame;stdcall;
      frm : TFrame;
    begin
      HandleDLL := StrToInt(Copy(Button.Hint,21,3));
     
      GetFrame := LierFonction(ExtractFilePath(Application.ExeName) + '\Data\' +
        Trim(Copy(Button.Hint,1,20)), HandleDLL,'GetFrame');
      if Assigned(GetFrame) then
      begin
        frm := GetFrame;
        frm.Parent := Panel1;
      end;
    En fait est ce que part sur une bonne idée ou est ce carrement tout faux ^^

    J'ai essayé aussi en créeant une procédure dans ma dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure CreateFrame (Panel : TPanel);
    begin
      AboutBox:= TAboutBox.Create(Panel);
      AboutBox.Parent := Panel;
    end;
    Mais j'ai eu le droit à une joli violation d'acces
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Désolé de te le dire aussi franchement .. mais tout est faux

    Non en fait, le probleme des Dlls c'ets que l'on ne peux pas exporter des objets.
    La raison c'est que C++ et Delphi ne codent pas de la meme maniere les objets en memoire (comme les fonction d'ou les directive stdcall ou cdecl) donc une dll C++ exportant une adresse d'un objet dans un exe Delphi va foirer car les zones memoire ne seront pas lu de la meme maniere.

    MEme si ta Dll est aussi en delphi je ne guaranti pas la compatibilité et de toute facon c'est contraire a l'esprit "dll".

    L'astuce est de passer par une interface. C'ets je crois le tutorien de SJRD.
    Bien que je le trouve un peu complexe pour une initiation il montre pas mal d'aspects de la gestion des interface et de l'exportation d'obkjets.
    Je te conseille la lecture du chapitre sur les DLL du livre de Paul Toth "Delpho 7 Studio" que l'on trouve sur le net au format PDF si tu n'a pas le bouquin (tres bon investissement d'ailleur).

    L'avantage des Interfaces c'ets qu'elle sont standardisé et tous les languages suportant les interfaces doivent les gerer de la meme maniere. Ton objet implemantant une interface sera donc oblige de coder gerer la declaration memoire des methodes impose par l'interface d'une maniere standard, ce qui evite les conflit entre les laguages. Je rentre pas trop dans les details ...

    Sinon tu peux utilsier les packages : Cela fait parti de mon tutoriel.
    Un package ou BPL n'est rie nde plus qu'un DLL amélioré par Borland pour inclure une partie declaratio nde types (qui saute dans les DLL).
    Au final, le BPL est une DLL standardisé au modele Delphi (pascal) et donc offrant plsu d'avantages dont la possibilité d'exporter des Classes Delphi.
    L'inconvenient c'ets que du coup on pert la compatibilité avec les logiciels C++ ...
    JE te conseilel de te pencher un peu la dessus, meme si ca pose quelque problemes secondaire, la plupart du temps ca peut rendre pas mal de services (je ne maitrise pas encore toutes les ficelles de la gestion des packages pour l'exploiter au max).

    Sinon ce que je tr proposais comme solution (que je trouve un peu bancale mais qui marche tres bien) est de passer par les API Windows :

    DLL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Procedure CreateFrame (aPArentHandle : THandle); stdcall;
    Begin
    MaFrame := TMAFRame.Create(nil);
    Windows.SetPArent(APArentHandle, MaFrame.Handle); // Inverse peut etre les 2 parametres ;)
    End;
     
    PRocedure DestroyFrame; stdcall;
    Begin
    FreeAndNil(MaFRame);
    End;
     
    Exports CreateFrame, DestroyFrame;
    JE trouve ca un peu bancal car meme si le resutat est tout a fait correcte, tu ne possede pas de references sur un Objet PArent de typ TWincontrol et donc l'acces a ses methodes Height/Width/LEft/Etc ... necessaire a la gestion du redimentionnement automatique (anchors) et assimilés.

    PEnse a bien refler la propriete PArentFont a false sinon tu aura un bug.

    Voila pour demarrer et bonne chance dans ce domaine car cela n'ets pas une chose facile .... et je parle en connaissance de cause : J'ay ai bien passe quelque mois sur une bonne diszaines de topic sur le sujet
    avec mes colleges SJRD et autres :p

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    La compatibilité avec C++ ou autre je m'en moque un peu.
    Cette application sera en delphi pour delphi.
    C'est surtout pour un soucis de mise à jour plus simple du logiciel (que je sois pas obliger d'envoyer l'exe complet à chaque fois).

    Enfin, bon merci pour les conseils, je vais mieux zieuter le tuto avec les packages ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    D'ou mon conseille sur les packages

    Sinon que Dll et Exe soient du meme language ou non le fait que le concept d'une Dll lest d'etre cross-langage, cela interdit tout "specialité" d'un language .. donc la transmission de classes

    MEme les strings sont interdit en parametres .. sans utilisation de la Dll ShareMem. Pour pas t'embeter avec passe que des PChar en parametres chaine.

    Tu remarquera que toutes les Dll utilise des PChar

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Pour les String j'avais lu, j'ai lu le tuto sur les dll avant quand même

    Bon allez hop, c'est partie pour regarder les packages ^^

    Merci
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2011, 12h51
  2. [XL-2003] Probleme sur appel de fonction auto depuis une cellule faisant une affectation
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/05/2011, 13h43
  3. manipuler un composant d'une frame depuis une autre frame
    Par Jcpan dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 14/01/2009, 11h27
  4. Rechercher depuis une frame dans une autre
    Par torkal27 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/12/2008, 14h32

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