Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler beim dyn. Laden einer DLL (https://www.delphipraxis.net/64892-fehler-beim-dyn-laden-einer-dll.html)

bixi400 9. Mär 2006 16:33


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:
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.
DLL:
Delphi-Quellcode:
library MyDLL;

uses
  SysUtils,
  Classes;

{$R *.res}

function GetText:String;
begin
  Result:='Dieser Text wird aus einer DLL geladen!!!';
end;

exports GetText;


begin
end.
kann mir jemand sagen wo der Fehler ist?

Bernhard Geyer 9. Mär 2006 16:35

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;

bixi400 9. Mär 2006 16:41

Re: Fehler beim dyn. Laden einer DLL
 
Zitat:

Zitat von Bernhard Geyer
@MyPointer ist immer <> nil...

Das hab ich so aus einem Beispiel.
Aber es war leider nicht der Fehler

Bernhard Geyer 9. Mär 2006 17:01

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:

ShareMem muß sich in der
ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
Strings als Parameter oder Funktionsergebnisse übergeben.

ste_ett 9. Mär 2006 17:05

Re: Fehler beim dyn. Laden einer DLL
 
Oder man benutzt alternativ PChars. :)

Sebastian R. 9. Mär 2006 17:07

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!

Frank Borland 9. Mär 2006 17:26

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:
  MyDLL := LoadLibrary('MyDLL.dll');
@MyFunction:= GetProcAddress(MyDLL, 'GetText');
Text:= MyFunction;
ShowMessage(Text);
FreeLibrary(MyDLL);
Gruß


Malte


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