![]() |
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:
Und der dll-Code:
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;
Delphi-Quellcode:
Ich habe mal versucht, den Code der dll direct als Unit einzubinden. Das hat auch funktioniert. Und ich habe keine Fehlermeldung erhalten.
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. Die Fehlermeldung hab ich mal angehängt |
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'
|
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. |
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)
|
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. |
Re: Fehler beim laden einer Funktion aus einer Dll
Und wie kann ich das überprüfen?
|
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; |
Re: Fehler beim laden einer Funktion aus einer Dll
Moin eikeble,
dann hätte die Funktion 0 (nil) zurückgeliefert.
Delphi-Quellcode:
Um es zu verallgemeinern:
if not assigned(...) then // true=Fehler
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. |
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>
|
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:
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.
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; Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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