Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fehler beim laden einer Funktion aus einer Dll (https://www.delphipraxis.net/46878-fehler-beim-laden-einer-funktion-aus-einer-dll.html)

eikeble 2. Jun 2005 09:12


Fehler beim laden einer Funktion aus einer Dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin gerade dabei, zu lernen, wie man dll dynamisch lädt, damit ich meinem Program Plugins zur verfügung stellen kann. Aus einem Tutorial habe ich mir das gebastelt:

Der aufruf im Hauptprogramm (die unwichtigen Teile entfernt):
Delphi-Quellcode:
procedure TfrmMain.FormClick(Sender: TObject);
var hDLL : THandle;
    dllName : PAnsiChar;
    aHeight : Integer;
    TopLeft : TPoint;
    Start : procedure(aHandle : THandle; var aHeight : Integer; aTopLeft : TPoint);
begin
    //ShowMessage(dllName);
    hDLL := LoadLibrary(dllName);
    if hDLL <> 0 then begin
      try
        Start := GetProcAddress(hDLL, 'Start');
        Start(frmMain.Handle, aHeight, TopLeft); //<-bei diesem Schritt tritt der Fehler auf
      finally
        FreeLibrary(hDLL);
      end;
    end;
  end;
end;
Und der dll-Code:
Delphi-Quellcode:
library about;

uses
  Forms, ShareMem, Types,
  uAbout in 'uAbout.pas' {fAbout};

{$R *.res}

procedure start(aHandle : THandle; var aHeight : Integer; aTopLeft : TPoint);
begin
  fAbout := TfAbout.Create(nil);
  fAbout.ParentWindow := aHandle;
  aHeight := fAbout.Height;
  fAbout.Left := aTopLeft.X;
  fAbout.Top := aTopLeft.Y;
  fAbout.BorderStyle := bsNone;
  fAbout.BorderWidth := 0;
  fAbout.Width := 225;
  fAbout.Show;
end;

procedure ende;
begin
  fAbout.Free;
end;

exports
  start name 'start',
  ende name 'ende';

end.
Ich habe mal versucht, den Code der dll direct als Unit einzubinden. Das hat auch funktioniert. Und ich habe keine Fehlermeldung erhalten.
Die Fehlermeldung hab ich mal angehängt

nailor 2. Jun 2005 09:16

Re: Fehler beim laden einer Funktion aus einer Dll
 
wenn mich nicht alles täuscht ist die Sache case-sensitive, und 'Start' ist nicht 'start'

eikeble 2. Jun 2005 09:18

Re: Fehler beim laden einer Funktion aus einer Dll
 
Wenn es daran liegt und das könnte gut angehen, beiß ich mir in den A...
Probiers mal aus.

nailor 2. Jun 2005 09:20

Re: Fehler beim laden einer Funktion aus einer Dll
 
in solchen fällen kann man auch mal nen try/except anwenden, dann kann man sich auch genauer anzeigen lassen, was nicht geklappt hat. ist generell keine schlechte sache, bei aktionen die durchaus mal schiefgehen können (dll laden)

Christian Seehase 2. Jun 2005 09:28

Re: Fehler beim laden einer Funktion aus einer Dll
 
Moin eikeble,

wenn Du eine Funktion mit GetProcAddress importierst, solltest Du vor der Verwendung grundsätzlich prüfen, ob der Import erfolgreich war.

eikeble 2. Jun 2005 09:30

Re: Fehler beim laden einer Funktion aus einer Dll
 
Und wie kann ich das überprüfen?

barf00s 2. Jun 2005 09:32

Re: Fehler beim laden einer Funktion aus einer Dll
 
Delphi-Quellcode:
var start: function(blubb): blah; stdcall;

begin
  ... loadlibrary...
  @start := GetProcAddress(hDll, 'start');
  if Assigned(@start) then
    start(blub);
  freelibrary(hdll);
  ...
end;

Christian Seehase 2. Jun 2005 09:35

Re: Fehler beim laden einer Funktion aus einer Dll
 
Moin eikeble,

dann hätte die Funktion 0 (nil) zurückgeliefert.

Delphi-Quellcode:
if not assigned(...) then // true=Fehler
Um es zu verallgemeinern:
Wenn Du eine Funktion benutzt, bei der Du Erfolg oder Misserfolg des Aufrufes ermitteln kannst, solltest Du es auch prüfen.
Man darf sich eigentlich nie darauf verlassen, dass ein Aufruf so funktionert wie gewünscht, wenn man es nicht geprüft hat.

barf00s 2. Jun 2005 09:56

Re: Fehler beim laden einer Funktion aus einer Dll
 
btw, die schreibweise von funktionsnamen die man aus dlls importieren will ist glaubich egal in delphi. </senf>

alcaeus 2. Jun 2005 09:56

Re: Fehler beim laden einer Funktion aus einer Dll
 
Hallo allerseits,

bei Funktionen klappt das mit Assigned nicht mehr, vor allem wenn die Funktion nur einmal ausgefuehrt werden darf. Deshalb habe ich es so gemacht:
Delphi-Quellcode:
type
  TFunc = function(foo: Integer;): TForm; stdcall;
var
  ProcAddr: Pointer;
  SomeForm: TForm;
begin
  //...
  ProcAddr := GetProcAddr(hDll, 'someProc');
  if not Assigned(ProcAddr) then
  begin
    //...
    exit;
  end;
  SomeForm := TFunc(ProcAddr)(0);
end;
Wenn man ProcAddr nicht als Pointer sondern direkt als function... deklariert, so wuerde man einen eventuellen Rueckgabewert pruefen. Das heisst, die Funktion wird einmal ausgefuehrt (jedenfalls war das bei mir so). Arbeitet man hingegen mit dem Pointer und castet nachher einfach auf den Funktionstyp, dann sollte es keine Probleme geben.

Greetz
alcaeus


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