Modifier interface par une DLL [Résolu]

cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 21 déc. 2008 à 23:08 - Dernière réponse : cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention
- 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 

4 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 déc. 2008 à 15:20
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 déc. 2008 à 17:50
+3
Utile
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...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 22 déc. 2008 à 17:41
0
Utile
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
cs_christophedlr 257 Messages postés samedi 3 janvier 2004Date d'inscription 30 mai 2016 Dernière intervention - 22 déc. 2008 à 17:57
0
Utile
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.