Modifier interface par une DLL [Résolu]

Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
30 mai 2016
- - Dernière réponse : cs_christophedlr
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
30 mai 2016
- 22 déc. 2008 à 17:57
Bonsoir,

Je voudrais savoir si il est possible via une DLL, de modifier l'interface du programme qui est dans l'EXE en lui même.
Se serait pour un système de plugins dans mon programme.
Si oui comment faire ?

Merci d'avance à ceux qui pourront m'aider.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
3
Merci
Salut,

C'est jamais top d'essayer de faire passer des objets de la dll vers un exe et inversement. Déjà on est forcément incompatible avec les autres langages, mais en plus il faut faire attention à compiler l'exe et la dll avec le même compilateur Delphi. Et il faut penser à l'unité ShareMem.

Dans tout les cas on est rarement à l'abri d'un plantage, au chargement de la form, à la fermeture de l'appli... C'est pas évident de trouver une combinaison qui marche. Faut savoir par exemple que je n'ai jamais réussi à utiliser le thème XP dans une form dans une dll sans charger la dll dynamiquement.

Voilà quelques éssai, en proposant de charger la dll de manière dynamique ou non :
<hr size="2" width="100%" />unit Unit1;

interface

uses
  ShareMem,
  Windows,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

//{$DEFINE EXTERNAL}

{$IFDEF EXTERNAL}

function GetPlugInGUI(lpApplication: TApplication; lpParentComponent: TWinControl): TWinControl; external 'project2.dll';

{$ELSE}

type TGetPlugInGUI = function(lpApplication: TApplication; lpParentComponent: TWinControl): TWinControl;

{$ENDIF}

var
  Form1: TForm1;
{$IFNDEF EXTERNAL}
  GetPlugInGUI: TGetPlugInGUI;
  hLib: THandle;
{$ENDIF}

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
{$IFNDEF EXTERNAL}
  GetPlugInGUI:= GetProcAddress(hLib, 'GetPlugInGUI');
  if @GetPlugInGUI = nil then ShowMessage('Echec du chargement de la routine GetPlugInGUI');
{$ENDIF}

  GetPlugInGUI(Application, Self);
end;

initialization
{$IFNDEF EXTERNAL}
  hLib:= SafeLoadLibrary('Project2.dll');
  if hLib = 0 then RaiseLastOSError;
{$ENDIF}
finalization
{$IFNDEF EXTERNAL}
  FreeLibrary(hLib);
{$ENDIF}
end.
<hr size="2" width="100%" />unit Unit2;

interface

uses
  ShareMem,
  Windows,
  SysUtils,
  Classes,
  Dialogs,
  Forms,
  Controls,
  StdCtrls;

function GetPlugInGUI(lpApplication: TApplication; lpParentComponent: TWinControl): TWinControl;

implementation

function GetPlugInGUI(lpApplication: TApplication; lpParentComponent: TWinControl): TWinControl;
begin
  Result:= TEdit.Create(lpApplication);
  with (Result as TEdit) do
  begin
    ParentFont:= False;     // Pour ne pas planter lors du Parent:=
    Parent:= lpParentComponent;
    Text:= 'Hello Wrold';
    Width:= 100;
    Height:= 50;
    Left:= 0;
    Top:= 0;
  end;
end;

end.

Merci cs_rt15 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Dernière intervention
7 novembre 2014
3
Merci
J'aime beaucoup le "tout simplement".

Bin il me semble que ce que tu veux faire est relativement clair, et que c'est ce qui est fait ci-dessus :

Une dll de plugin qui doit proposer une fonction GetPlugInGui renvoyant un TWinControl et prenant en argument l'application et un TWinControl qui va servir de parent.

Après, cette dll renvoie ce qu'elle veut, ici un TEdit, qui est affiché dans la form de l'appli. Avec un autre plugin, on pourrait avoir une image dans la form, ou tout ce que l'on veut...

Merci cs_rt15 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
30 mai 2016
0
Merci
Donc en fait il suffirait tous simplement de passer la form en tan que var à la DLL ?
L'avantage de pouvoir faire des plugins c'est de rajouter des fonctions au logiciel et pouvant être fait par n'importe qui (suivant une API bien sur ;)).
Et la possibilité de changement de l'interface via cette DLL permettrait par exemple de rajouter des options directement visible, ou ajouter un menu supplémentaire etc.

Je sais pas si j'explique bien ce que je souhaite faire.
Commenter la réponse de cs_christophedlr
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
30 mai 2016
0
Merci
OK, merci de l'information.
Commenter la réponse de cs_christophedlr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.