AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Speicherverltzung beim Laden einer DLL
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherverltzung beim Laden einer DLL

Ein Thema von Sliver · begonnen am 21. Sep 2005 · letzter Beitrag vom 23. Sep 2005
Antwort Antwort
Sliver

Registriert seit: 27. Jul 2004
18 Beiträge
 
#1

Speicherverltzung beim Laden einer DLL

  Alt 21. Sep 2005, 17:08
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
  Mit Zitat antworten Zitat
Sliver

Registriert seit: 27. Jul 2004
18 Beiträge
 
#2

Re: Speicherverltzung beim Laden einer DLL

  Alt 23. Sep 2005, 08:51
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 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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#3

Re: Speicherverltzung beim Laden einer DLL

  Alt 23. Sep 2005, 13:05
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 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"
  Mit Zitat antworten Zitat
Sliver

Registriert seit: 27. Jul 2004
18 Beiträge
 
#4

Re: Speicherverltzung beim Laden einer DLL

  Alt 23. Sep 2005, 18:40
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Speicherverltzung beim Laden einer DLL

  Alt 23. Sep 2005, 19:53
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.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#6

Re: Speicherverltzung beim Laden einer DLL

  Alt 23. Sep 2005, 20:00
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).
  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 08:54 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