Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PlugIn DLL laden (https://www.delphipraxis.net/73720-plugin-dll-laden.html)

arbu man 22. Jul 2006 21:04


PlugIn DLL laden
 
Hi,

ich möchte ein Plugin system schreiben dabei lade ich mit folgenden code die plug in dll:
Delphi-Quellcode:
type
  TProcInitPlg = procedure (ixi :IIxion; hlib: integer);

procedure TIxionPlugInSystem.LoadPlugIn(FFilename: string);
var
  aProc: TProcInitPlg;
  hDLL: HWND;
  fProc: TFarProc;
  inter: IIxion; // interface
begin
  hDll := LoadLibrary(PChar(FFilename));
  if hDLL <> 0 then begin
    fProc := GetProcAddress(hDLL,'init');
    if fProc <> nil then begin
      @aProc := fProc;
    end else Exit;
    inter:=Self;
    aProc(inter, hDll);
    AddHLib(hDLL);
  end;
end;

procedure TIxionPlugInSystem.AddHLib(h: integer);
begin
  setlength(List, length(List)+1); // List ist array of integer
  List[length(List)-1]:= h;
end;
Eine dll kann man mit dem Code auch laden aber bei der 2 DLL kommt eine AV. Woran liegt das ?

mfg, Björn

gsh 22. Jul 2006 22:52

Re: PlugIn DLL laden
 
hast du schon mal debuggt?
bei welcher Codezeile trit der fehler auf?
was ist die Variable List genau? Array?
was ist der typ TFarProc?

Warum so?
Delphi-Quellcode:
fProc := GetProcAddress(hDLL,'init');
    if fProc <> nil then begin
      @aProc := fProc;
und nicht so?
Delphi-Quellcode:
aProc := GetProcAddress(hDLL,'init');
if aProc = nil then exit;

arbu man 22. Jul 2006 23:04

Re: PlugIn DLL laden
 
Zitat:

bei welcher Codezeile trit der fehler auf?
sagt mir delphi nicht delphi sagt nur in LoadPlugIn...

Zitat:

was ist die Variable List genau? Array?
Array of integer;
Zitat:

was ist der typ TFarProc?
Windows.TFarProc ~ Pointer


ok hab denn code geändert aber da tut sich nichts

lizardking 23. Jul 2006 00:02

Re: PlugIn DLL laden
 
Zitat:

Zitat von arbu man
Zitat:

bei welcher Codezeile trit der fehler auf?
sagt mir delphi nicht delphi sagt nur in LoadPlugIn...

Wenn du beim Debuggen Zeile fuer Zeile durchgehst, muesstest Du doch genau sehen, bei welcher Anweisung der Fehler auftritt. Sollte es beim Aufruf der Funktion in der DLL passieren, dann eben weiterschauen und diese Schritt fuer Schritt im Debug-Modus durchgehen.

Gruesse,

Lizzy

xaromz 23. Jul 2006 00:12

Re: PlugIn DLL laden
 
Hallo,

hier mal meine Vermutung:
Du übergibst Dein Plugin-Syste als Interface an die DLL. Du hast aber sonst keinerlei Referenzen auf dieses Interface.
Jetzt passiert Folgendes:
  • TIxionPlugInSystem erzeugen -> Referenzzähler = 0
  • TIxionPlugInSystem an Inter als Interface zuweisen -> Referenzzähler = 1
  • Inter an DLL übergeben -> Referenzzähler ändert sich nicht (meine Vermutung)
  • LoadPlugIn verlassen, Inter wird geleert -> Referenzzähler = 0 -> TIxionPlugInSystem wird freigegeben
  • auf freigegebenes TIxionPlugInSystem wird zugegriffen -> AV
Übrigens: Du solltest Interfaces immer mittels const übergeben, dann fällt nämlich eine Manipulation des Referenzzählers weg.

Gruß
xaromz

arbu man 23. Jul 2006 09:14

Re: PlugIn DLL laden
 
ok hab den code etwas geändert und alles als const übergeben:
Delphi-Quellcode:
procedure TIxionPlugInSystem.LoadPlugIn(FFilename: string);
var
  aProc: TProcInitPlg;
  hDLL: HWND;
  fProc: TFarProc;
  inter: IIxion;
begin
  hDll := LoadLibrary(PChar(FFilename));
  if hDLL <> 0 then begin
    fProc := GetProcAddress(hDLL,'init');
    if fProc = nil then exit;
    @aProc := fProc;
    aProc(Self, hDll);
    AddHLib(hDLL);
  end;
end;
Jetzt klappt es :)Jedoch habe ich keine ahnung was ein Referenzzähler ist oder wie man im Debugger zeilenweise vorrückt :roll:

xaromz 23. Jul 2006 09:31

Re: PlugIn DLL laden
 
Hallo,
Zitat:

Zitat von arbu man
ok hab den code etwas geändert und alles als const übergeben:

Noch ein kleiner Tipp: Auch Strings sollte man, wo möglich, als const übergeben.
Zitat:

Zitat von arbu man
Jetzt klappt es :)Jedoch habe ich keine ahnung was ein Referenzzähler ist oder wie man im Debugger zeilenweise vorrückt :roll:

Debugger: F7 bzw. F8

Referenzzähler: Da hab' ich mal ein Tutorial geschrieben.

Gruß
xaromz

arbu man 23. Jul 2006 09:38

Re: PlugIn DLL laden
 
danke für das tutorial, wie gesagt ich hab alles auch die widestrings als const übergeben... by the way widestrings sind wirkliche eine gute alternative strings bei dlls :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 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