AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Plugin mit Interface Schnittstelle mit Zugriff auf Host
Thema durchsuchen
Ansicht
Themen-Optionen

Plugin mit Interface Schnittstelle mit Zugriff auf Host

Ein Thema von Luckie · begonnen am 18. Sep 2007 · letzter Beitrag vom 20. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 18. Sep 2007, 15:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 18. Sep 2007, 15:41
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?

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 18. Sep 2007, 15:54
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 11:08
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 11:16
Hallo,

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

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 11:28
Danke für das Angebot. Im Anhang das Projekt.
Angehängte Dateien
Dateityp: zip mpuhostplugin_175.zip (396,8 KB, 23x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 12:03
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 12:34
Luckie, du hast eine komische Art zu programmieren...
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?
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)
Angehängte Dateien
Dateityp: 7z mpuhostplugin_585.7z (3,2 KB, 31x aufgerufen)
Robert Giesecke
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 12:40
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Plugin mit Interface Schnittstelle mit Zugriff auf Host

  Alt 19. Sep 2007, 12:43
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
Robert Giesecke
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
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