![]() |
Fehler beim dyn. Laden einer DLL
Ich habe mal Versucht eine einfache DLL zu laden aber es tritt folgender Fehler auf:
Zugriffsverletzung bei Adresse 00404254 in Modul 'LoadDLL.exe'. Lesen von Adresse 00C00B3C EXE:
Delphi-Quellcode:
DLL:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TMyFunction = function: String; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var MyDLL:HWND; MyFunction:TMyFunction; MyPointer: TFarProc; Text:String; begin MyDLL := LoadLibrary('MyDLL.dll'); MyPointer := GetProcAddress(MyDLL, 'GetText'); if @MyPointer <> nil then begin @MyFunction:=MyPointer; Text:=MyFunction; ShowMessage(Text); end; FreeLibrary(MyDLL); end; end.
Delphi-Quellcode:
kann mir jemand sagen wo der Fehler ist?
library MyDLL;
uses SysUtils, Classes; {$R *.res} function GetText:String; begin Result:='Dieser Text wird aus einer DLL geladen!!!'; end; exports GetText; begin end. |
Re: Fehler beim dyn. Laden einer DLL
@MyPointer ist immer <> nil
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var MyDLL:HWND; MyFunction:TMyFunction; Text:String; begin MyDLL := LoadLibrary('MyDLL.dll'); MyFunction:= TMyFunction(GetProcAddress(MyDLL, 'GetText')); if Assigned(MyFunction) then begin Text:=MyFunction; ShowMessage(Text); end; FreeLibrary(MyDLL); end; |
Re: Fehler beim dyn. Laden einer DLL
Zitat:
Aber es war leider nicht der Fehler |
Re: Fehler beim dyn. Laden einer DLL
Hast Du denn Kommentar des DLL-Experten zur verwendung von Strings als Übergabe/Rückgabeparametern von DLL's gelesen?
Zitat:
|
Re: Fehler beim dyn. Laden einer DLL
Oder man benutzt alternativ PChars. :)
|
Re: Fehler beim dyn. Laden einer DLL
Eben, dass ist genau der Fehler, der auftritt, wenn man ShareMem nicht benutzt! Also: PChar benutzen oder halt ShareMem!
|
Re: Fehler beim dyn. Laden einer DLL
Moin!
Um mich an die Vorredner anzuschließen: Wenn VCL- spezifische Parameter verwendet werden (Klassen, Strings etc.) muss die unit sharemem eingebunden werden. Die Verwendung von PChar stellen wir mal hintenan :-) Deklariere die Funktionen immer eindeutig mit StdCall (oder anders) spätestens wenn Parameter oder Dritte hinzukommen (was der Sinn einer DLL ist) :-) TFarProc dürfte nur noch als Pointer deklariert sein. Also:
Delphi-Quellcode:
Gruß
MyDLL := LoadLibrary('MyDLL.dll');
@MyFunction:= GetProcAddress(MyDLL, 'GetText'); Text:= MyFunction; ShowMessage(Text); FreeLibrary(MyDLL); Malte |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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