![]() |
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:
Plugin:
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;
Delphi-Quellcode:
Host:
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;
Delphi-Quellcode:
Jetzt bekomme ich leider beim Aufruf der Execu8te-Methode eine AV und ich weiß nicht warum.
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; |
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:... |
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.
|
Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
Also, wenn ich es so mache:
Delphi-Quellcode:
bekomme ich keine AV. Allerdings hab eich jetzt ein Folgeproblem:
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;
Delphi-Quellcode:
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:
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; |
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 |
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.
|
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:
Bei mir funktioniert das so.
function TfrmMainHost.Handle: THandle;
begin Result := inherited Handle; // Eigenschaft aus TForm auslesen end; Gruß xaromz |
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) |
Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
Zitat:
@Elvis: Die Konstanten sind doch verständlich benannt, ich weiß nicht, warum du dich daran störst. |
Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host
Zitat:
Ich hätte sie so genannt: PLUGINVERMAJOR -> PluginMajorVersion |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz