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 :

[Package] Gestion de plugin


Sujet :

Langage Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut [Package] Gestion de plugin
    J'essai d'utiliser la gestion des packages en dynamique pour faire un programme "plugin".

    Mon problème vient du fait que je n'arrive pas à charger ma classe et je n'arrive pas à trouver pourquoi.

    J'ai suivit les indications de ce tutoriel (au lieu d'un panel j'ai une frame), mais rien à faire, j'ai une violation d'acces lors de la création de ma frame.

    Ma frame qui va être mis en package
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    type
      TAboutBox = class(TFrame)
        RichEdit1: TRichEdit;
        Panel1: TPanel;
        Panel2: TPanel;
        Comments: TLabel;
        Panel3: TPanel;
        Image1: TImage;
        Label1: TLabel;
        Version: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Email: TLabel;
        Label6: TLabel;
        procedure EmailClick(Sender: TObject);
        procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure EmailMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
      private
        { Déclarations privées }
      public
        constructor Create(Sender: TComponent);override;
        { Déclarations publiques }
      end;
     
    var
      AboutBox: TAboutBox;
     
    implementation
     
    constructor TAboutBox.Create(Sender: TComponent);
    begin
      Inherited Create(Sender);
      RichEdit1.Lines.LoadFromFile('Version.rtf');
    end;
     
    // etc ....
     
    Initialization
      RegisterClass(TAboutBox);
    Finalization
      UnregisterClass(TAboutBox);
    End.
    Et ci dessous l'appel au package

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        CategoryButtons1: TCategoryButtons;
        ListBox1: TListBox;
        procedure CategoryButtons1ButtonClicked(Sender: TObject;
          const Button: TButtonItem);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure AjoutMenu ( iNum : integer;sName : String);
        procedure BtnOnClick (Sender : TObject);
      end;
    var
      Form1: TForm1;
      Plugins: Array Of TClassPlugIn;
     
    implementation
     
     
    {$R *.dfm}
     
    procedure TForm1.AjoutMenu(iNum: integer;sName : String);
    var
      i : integer;
     
      Categ : TButtonCategory;
      Button : TButtonItem;
      bFound : Boolean;
     
    begin
      SetLength(Plugins, iNum + 1);
      Plugins[iNum].Handle := LoadPackage(ExtractFilePath(Application.ExeName) + '\data\' + sName);
      PlugIns[iNum].Classe := GetClass('TAboutBox'); //<------------ Déjà ici Classe = nil juste après le chargement du package.
      // Gestion de la création du bouton non terminé
      i := 0; 
      Categ := TButtonCategory.Create(CategoryButtons1.Categories);
      Categ.Caption := 'Test';
      CategoryButtons1.Categories.AddItem(Categ,iNum);
     
      Button := TButtonItem.Create(Categ.Items);
      Button.Caption := 'Test';
      Button.Hint := IntToStr(iNum);
      Categ.Items.AddItem(Button,iNum);
     
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      SR: TSearchRec;
    begin
     
      If FindFirst(ExtractFilePath(Application.ExeName) + '\Data\*.bpl', faAnyFile, SR) = 0 then
      begin
        AjoutMenu(0,SR.Name);
        while FindNext(SR) = 0 do
        begin
          AjoutMenu(High(plugins) + 1,SR.Name);
        end;
        //Libération des ressources allouées pour la recherche
        FindClose(SR);
      end;
    end;
     
    procedure TForm1.CategoryButtons1ButtonClicked(Sender: TObject;
      const Button: TButtonItem);
    var
      MaClasse : TPersistentClass; 
      Instance : TControl;
    begin
      MaClasse := PlugIns[strtoint(Button.Hint)].Classe;
      Instance := TFrame(MaClasse).Create(panel1);
    end;
     
    end.

    Le type qui est dans une autre unité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type TClassPlugin = record
      Handle : THandle;
      Classe : TPersistentClass;
    end;
    Merci pour l'aide
    Modérateur Delphi

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

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    J'ai essayé directement ce que propose l'auteur du tuto, problème la classe n'est jamais trouvée
    Un problème de D2005 ??
    Modérateur Delphi

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

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    J'ai réussit une fois avec le système des interfaces, mais la je rencontre un problème qui fait que j'ai une violation d'accès quand je vérifie si mon plugin est à nil

    Ci dessous le code du plugin

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    unit AboutPlugin;
     
    interface
     
    uses
      ExtCtrls, forms,controls,PluginIntf;
     
    type
      TAboutPlugin = class(TInterfacedObject, IPlugin)
      private
        FFrame : TFrame;
      public
        constructor Create;
        destructor Destroy; override;
        function GetComponent : TFrame;
        function GetMenu : TMenuPlugin;
      end;
     
      function CreatePlugin : IPlugin;
     
    exports CreatePlugin;
     
    implementation
     
    uses udefsColor, AboutForm,Dialogs ;
     
    { TTestPlugin }
     
    function CreatePlugin : IPlugin;
    begin
      Result := TAboutPlugin.Create;
    end;
     
    constructor TAboutPlugin.Create;
    begin
      inherited;
      ShowMessage('Chargé');
      FFrame := TAboutBox.Create(nil);
      with FFrame do
      begin
        Align := alClient;
    //    Font.Size := 24;
    //    Font.Color := cl_net_ALICEBLUE;
    //    Caption := 'Panel créé dans le plug-in';
    //    Width := 500;
    //    Height := 300;
      end;
    end;
     
    destructor TAboutPlugin.Destroy;
    begin
      FFrame.Free;
      inherited;
    end;
     
    function TAboutPlugin.GetComponent : TFrame;
    begin
      Result := FFrame;
    end;
     
    function TAboutPlugin.GetMenu: TMenuPlugin;
    var
      Menu : TMenuPlugin;
    begin
      Menu.Categorie.Caption := 'Divers';
      Menu.Button.caption := 'A propos de';
      Result := Menu;
    end;
     
    end.
    code de l'unité commune appli et plugin

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    unit PluginIntf;
     
    interface
     
    uses ExtCtrls,
         Forms,
         controls,
         Graphics;
     
    Type TCategorieMenu = record
      Caption : String;
      Color : TColor;
      GradientColor : TColor;
      TextColor : TColor;
    end;
     
    type TButtonCategorieMenu = record
      Caption : String;
      Icon : TIcon;
      Position : integer;
    end;
     
     
    type TMenuPlugin = record
      Categorie : TcategorieMenu;
      Button : TButtonCategorieMenu;
    end;
     
    type
      IPlugin = interface
        ['{F1F7186D-76E3-4DBD-8707-408C792B1C82}']
     
        function GetMenu : TMenuPlugin;
        function GetComponent : TFrame;
     
        property Component : TFrame read GetComponent;
        property Menu : TMenuPlugin read GetMenu;
      end;
     
     IPluginCommands = interface
      ['{91595DCA-E02D-47CB-B98F-AA401AA94D02}']
     
     end;
     
    implementation
     
    end.
    et voici le code qui charge et lance le plugin

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    procedure TFrmMain.CreateButtonCateg(iNum : integer;sName : String);
    type
      TCreatePluginFunc = function : IPlugin; stdcall;
      TMenuPluginFunc = function : TMenuPlugin;stdcall;
     
    var
      Categ : TButtonCategory;
      Button : TButtonItem;
      bFound : Boolean;
      i : integer;
      Menu : TMenuPlugin;
      CreatePlugin : TCreatePluginFunc;
    begin
      SetLength(Plugin, iNum + 1);
      Plugin[iNum].Handle := LoadPackage(GAPPPATH + '\plug\' + sName);
      CreatePlugin := GetProcAddress(PlugIn[iNum].handle,'CreatePlugIn');
     
      if CreatePlugin = nil then // violation d'acces ici :roll:
      begin
        ShowMessage('Erreur de chargement du plugin : ' + sName);
        exit;
      end;
      PlugIn[iNum].Plug := CreatePlugin;
     
      Menu := PlugIn[iNum].Plug.Menu;
      bfound := False;
      i := 0;
     
      while (i <= CategoryButtons1.Categories.Count -1) and not bFound do
      begin
        if CategoryButtons1.Categories.Items[i].Caption = Menu.Categorie.Caption then
          bFound := True
        else
          inc(i);
      end;
     
      if bFound then
        Categ := CategoryButtons1.Categories.Items[i]
      else begin
        Categ := TButtonCategory.Create(CategoryButtons1.Categories);
        Categ.Caption := Menu.Categorie.caption;
        CategoryButtons1.Categories.AddItem(Categ,iNum);
      end;
     
      Button := TButtonItem.Create(Categ.Items);
      Button.Caption := Menu.Button.caption;
      Button.Hint := IntToStr(iNum);
      Categ.Items.AddItem(Button,iNum);
    end;
    et pour finir le type de mon tableau dynamique de plugin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type TPlugInsStruct = record
      Handle : integer;
      Plug : IPlugin;
    end;
    Si une bonne ame pouvait m'aider, m'indiquer où est le problème, car ca fait un bon moment que je suis dessus.

    Merci
    Modérateur Delphi

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

  4. #4
    Membre actif
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Février 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2004
    Messages : 27
    Points : 229
    Points
    229
    Par défaut
    Controle juste au dessus si ton Handle n'est pas égal à 0.

    Si il est égal à 0, c'est que ton appli n'est pas arrivé à charger ton interface.

    Il y a donc un problème en amont.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Le handle du plugin est bien > 0, le package est bien chargé
    Modérateur Delphi

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

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Il faut utiliser Assigned ou l'opérateur @ pour tester si la variable CreatePlugin a été affectée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not Assigned(CreatePlugin) then
    ou encore (moins utilisé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if @CreatePlugin = nil then
    Tel que tu l'as écris il appelle la méthode référencée par CreatePlugin, et teste si son résultat vaut nil.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

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

Discussions similaires

  1. [RCP] Gestion des plugins.
    Par lachesis dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 22/04/2006, 15h19
  2. [Conception] Gestion de "plugins"
    Par Tentative dans le forum Général Java
    Réponses: 4
    Dernier message: 06/01/2006, 19h55
  3. [Language]Gestion de plugins
    Par sozie9372 dans le forum Langage
    Réponses: 2
    Dernier message: 24/11/2005, 22h52
  4. [packages] gestion
    Par Longrais dans le forum Modules
    Réponses: 1
    Dernier message: 05/10/2005, 10h09
  5. ecrire une gestion de plugin ou greffon
    Par gegeambro dans le forum C++
    Réponses: 3
    Dernier message: 13/09/2005, 11h04

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