Delphi-PRAXiS

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

Sliver 21. Sep 2005 17:08


Speicherverltzung beim Laden einer DLL
 
hi zusammen

Ich habe das folgende Problem. Ich erstell mit C++ eine DLL. Die Test-Header Datei der DLL sieht so aus.
Delphi-Quellcode:
#ifdef DESCREATOR_EXPORTS
#define DESCREATOR_API extern "C" __declspec(dllexport)
#else
#define DESCREATOR_API extern "C" __declspec(dllimport)
#endif

DESCREATOR_API int fnDescreator(int);
Jetzt binde ich die DLL dynamisch (gleicher Fehler bei statischer Einbindung) so ein.
Delphi-Quellcode:
type
  TFunc1=function(i:Integer):Integer;stdcall;
//...

procedure TFrmDynDLLCall.btnFunc1Click(Sender: TObject);
var
  handle:THandle;
  f:TFunc1;
begin
  handle:=LoadLibrary('descreator.dll');
  if handle<>0 then begin
    btnFunc1.Caption:='Func1(3)';
    f:=GetProcAddress(handle,'fnDescreator');
    lblFunc1.Caption:=IntToStr(f(3));
    FreeLibrary(handle);
  end
  else
    ShowMessage('LoadLibrary error');
end;
Wenn ich jetzt die Funktion f(3) aufrufen möchte, kommt eine Speicherverletzung, das er diesen und jenen Speicherblock nicht lesen kann.
Sieht jemand von euch den Fehler?

cu Sliver

Sliver 23. Sep 2005 08:51

Re: Speicherverltzung beim Laden einer DLL
 
So nach langem herumprobieren habe ich jetzt die Lösung. In C++ wird eine DLL nicht gleich wie in Delphi mit dem Funktionsnamen exportiert. Darum führte der Aufruf
Delphi-Quellcode:
f:=GetProcAddress(handle,'fnDescreator');
zu einem Fehler. Um den richtigen Exportnamen herauszufinden geht man die die Konsole (cmd) und gibt den Befehl: tdump -ee descreator.dll ein. In der Konsole werden alle Exportierennamen ausgegeben und diese fügt man dannn bei GetProcAddress ein.

cu Sliver

Olli 23. Sep 2005 13:05

Re: Speicherverltzung beim Laden einer DLL
 
Zitat:

Zitat von Sliver
So nach langem herumprobieren habe ich jetzt die Lösung. In C++ wird eine DLL nicht gleich wie in Delphi mit dem Funktionsnamen exportiert. Darum führte der Aufruf
Delphi-Quellcode:
f:=GetProcAddress(handle,'fnDescreator');
zu einem Fehler. Um den richtigen Exportnamen herauszufinden geht man die die Konsole (cmd) und gibt den Befehl: tdump -ee descreator.dll ein. In der Konsole werden alle Exportierennamen ausgegeben und diese fügt man dannn bei GetProcAddress ein.

cu Sliver

Auch dazu gibt's was nettes ;) ...

extern "C"

Sliver 23. Sep 2005 18:40

Re: Speicherverltzung beim Laden einer DLL
 
Zitat:

Zitat von Sliver
...
#ifdef DESCREATOR_EXPORTS
#define DESCREATOR_API extern "C" __declspec(dllexport)
#else
#define DESCREATOR_API extern "C" __declspec(dllimport)
#endif
...

Habe ich ja gemacht, wie du im ersten Beitrag siehst. Funktioniert aber wie gesagt nicht. Oder versteh ich dich falsch?

cu Sliver

Olli 23. Sep 2005 19:53

Re: Speicherverltzung beim Laden einer DLL
 
Wenn es damit nicht geht, benutze am besten noch eine DEF-Datei zusätzlich. Das Problem hatte ich auch schonmal, leider konnte ich nicht exakt eruieren wieso es in einem Fall ausreichte extern "C" zu benutzen und im anderen Fall eine DEF-Datei gebraucht wurde. Sicherlich irgendwas kleines, was man leicht übersieht. Vielleicht weiß jemand anderes wo ich (und du) da die Schrauben falsch gestellt habe.

NicoDE 23. Sep 2005 20:00

Re: Speicherverltzung beim Laden einer DLL
 
Um nicht mit Linker-Pragmas arbeiten zu müssen, sollte man immer eine Moduldefinitionsdatei für die Exporte verwenden (auch mit extern "C" 'verschwindet' das Name-Mangling nicht vollständig).


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