AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim dyn. Laden einer DLL

Ein Thema von bixi400 · begonnen am 9. Mär 2006 · letzter Beitrag vom 9. Mär 2006
Antwort Antwort
Benutzerbild von bixi400
bixi400

Registriert seit: 19. Mai 2003
179 Beiträge
 
Turbo Delphi für Win32
 
#1

Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 16:33
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 16:35
@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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von bixi400
bixi400

Registriert seit: 19. Mai 2003
179 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 16:41
Zitat von Bernhard Geyer:
@MyPointer ist immer <> nil...
Das hab ich so aus einem Beispiel.
Aber es war leider nicht der Fehler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 17:01
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#5

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 17:05
Oder man benutzt alternativ PChars.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Sebastian R.

Registriert seit: 12. Feb 2006
94 Beiträge
 
#6

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 17:07
Eben, dass ist genau der Fehler, der auftritt, wenn man ShareMem nicht benutzt! Also: PChar benutzen oder halt ShareMem!
Sebastian R.
Keep on programming!


CyCode.net - Meine Programme, Tutorials und Quelltexte
  Mit Zitat antworten Zitat
Frank Borland

Registriert seit: 12. Feb 2006
Ort: Hamburg
55 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Fehler beim dyn. Laden einer DLL

  Alt 9. Mär 2006, 17:26
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 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