Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Plugin mit Interface Schnittstelle mit Zugriff auf Host (https://www.delphipraxis.net/99843-plugin-mit-interface-schnittstelle-mit-zugriff-auf-host.html)

Luckie 18. Sep 2007 15:37


Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Nach dem ich mich mit Hydra und sakuras Plugin-Tutorial beschäftigt habe, habe ich mal so zum Lernen selber etwas auf die Beine gestellt:

Interface:
Delphi-Quellcode:
type
  IHost = interface(IInterface)
    ['{BB3C55ED-5AC3-4CE8-84B7-7B11DE022245}']
    function Handle: THandle;
    function HostFilename: String;
  end;

  IPlugin = interface(IInterface)
    ['{0A8E4F91-16C9-4A95-858F-DF1AB61BE406}']
    function Name: String;
    function VerMajor: Cardinal;
    function VerMinor: Cardinal;
    function Author: String;
    function Comment: String;
    procedure Execute(Host: IHost);
  end;
Plugin:
Delphi-Quellcode:
type
  TPlugin = class(TInterfacedObject, IPlugin)
  private
    function Name: string;
    function VerMajor: Cardinal;
    function VerMinor: Cardinal;
    function Author: string;
    function Comment: string;
    procedure Execute(Host: IHost);
  end;

...;

procedure TPlugin.Execute(Host: IHost);
var
  Buffer: array [0..255] of Char;
begin
  SendMessage(Host.Handle, WM_GETTEXT, sizeof(Buffer), Integer(@Buffer));
  MessageBox(Host.Handle, Buffer, 'Plugin MessageBox', MB_ICONINFORMATION);
end;
Host:
Delphi-Quellcode:
procedure TfrmMainHost.btnLoadPluginsClick(Sender: TObject);
begin
  try
    LoadPlugin(ExtractFilePath(ParamStr(0)) + 'Plugin01.dll');
    FPlugin.Execute((FHost as IHost));
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;

function TfrmMainHost.Handle: THandle;
begin
  Result := Handle;
end;
Jetzt bekomme ich leider beim Aufruf der Execu8te-Methode eine AV und ich weiß nicht warum.

sakura 18. Sep 2007 15:41

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Wie hast Du FHost deklariert? Es kann durch automatisches Dereferencing passieren, dass es bereits freigegeben ist, wenn Du es als Klasse definiert hast, definiere es evtl. gleich als IHost.

Hast Du ShareMem in Deinem Projekt und in den DLLs aufgenommen?

...:cat:...

Luckie 18. Sep 2007 15:54

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Jupp, ShareMem ist in den Uses aufgenommen. Ich hatte es als IInterface deklariert, aber auch, wenn ich es als IHost deklariere bekomme ich eine AV.

Luckie 19. Sep 2007 11:08

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Also, wenn ich es so mache:
Delphi-Quellcode:
procedure TfrmMainHost.btnLoadPluginsClick(Sender: TObject);
begin
  try
    LoadPlugin(ExtractFilePath(ParamStr(0)) + 'Plugin01.dll');
    FHost := (frmMainHost as IHost);
    FPlugin.Execute(FHost);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
bekomme ich keine AV. Allerdings hab eich jetzt ein Folgeproblem:
Delphi-Quellcode:
procedure TPlugin.Execute(Host: IHost);
var
  Buffer: array [0..255] of Char;
begin
  //SendMessage(Host.Handle, WM_GETTEXT, sizeof(Buffer), Integer(@Buffer));
//  MessageBox(Host.Handle, PChar(IntToStr(Host.Handle)), 'Plugin MessageBox', MB_ICONINFORMATION);
  MessageBox(0, 'Test', 'Plugin MessageBox', MB_ICONINFORMATION);

end;
greife ich in der Execute-Methode nicht auf Host.Handle zu, sehe ich die Messagebox. Benutze ich aber Host.Handle, wird die Messagebox nicht angezeigt. :gruebel:

xaromz 19. Sep 2007 11:16

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Hallo,

poste doch mal Dein komplettes Projekt (Hauptprogramm und PlugIn). Dann schau ich mir das mal an.

Gruß
xaromz

Luckie 19. Sep 2007 11:28

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für das Angebot. Im Anhang das Projekt.

xaromz 19. Sep 2007 12:03

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Hallo,

also, wenn Du als Handle einfach die 43 zurücklieferst, dann musst Du Dich auch nicht wundern. Ändere doch mal Deine Anwendung wie folgt ab:
Delphi-Quellcode:
function TfrmMainHost.Handle: THandle;
begin
  Result := inherited Handle; // Eigenschaft aus TForm auslesen
end;
Bei mir funktioniert das so.

Gruß
xaromz

Elvis 19. Sep 2007 12:34

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Liste der Anhänge anzeigen (Anzahl: 1)
Luckie, du hast eine komische Art zu programmieren... :freak:
Erst all-caps-Konstanten, die auch noch Abkürzungen enthalten und somit zu akuten Hirnknoten führen ( PLUGINVERMAJOR ), und dann benennst du Funktionen als wären sie Eigenschaften? :shock:
Aber komplett ungeachtet all dessen[1], hier hast du im Anhang einen Bleistift, der dir zeigt, wie man es PlugIns ermöglichen kann, MenuItems in einem Context menu anzulegen. (Ohne dass sie zuviel Wissen (=Macht) über das Menü bekommen.

Generell würde ich dir empfehlen von AnsiString auf WideString zu wechseln und alle Methoden zu stdcall zu ändern. (Warum sich unnütz in Delphi einzimmern, hmm? )


[1] ich habe die oben genannten Punkte nicht verändert)

Luckie 19. Sep 2007 12:40

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Zitat:

Zitat von xaromz
Hallo,

also, wenn Du als Handle einfach die 43 zurücklieferst, dann musst Du Dich auch nicht wundern. Ändere doch mal Deine Anwendung wie folgt ab:
Delphi-Quellcode:
function TfrmMainHost.Handle: THandle;
begin
  Result := inherited Handle; // Eigenschaft aus TForm auslesen
end;
Bei mir funktioniert das so.

Gruß
xaromz

Zum Testen habe ich das Handle ja nicht benutzt, sondern wollte es mir nur ausgeben lassen.

@Elvis: Die Konstanten sind doch verständlich benannt, ich weiß nicht, warum du dich daran störst.

Elvis 19. Sep 2007 12:43

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
 
Zitat:

Zitat von Luckie
@Elvis: Die Konstanten sind doch verständlich benannt, ich weiß nicht, warum du dich daran störst.

Wenn man 10 Jahre lang nur widerliche Win-API Konstanten gesehen hat, dann vlt.
Ich hätte sie so genannt: PLUGINVERMAJOR -> PluginMajorVersion


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz