![]() |
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:
Jetzt binde ich die DLL dynamisch (gleicher Fehler bei statischer Einbindung) so ein.
#ifdef DESCREATOR_EXPORTS
#define DESCREATOR_API extern "C" __declspec(dllexport) #else #define DESCREATOR_API extern "C" __declspec(dllimport) #endif DESCREATOR_API int fnDescreator(int);
Delphi-Quellcode:
Wenn ich jetzt die Funktion f(3) aufrufen möchte, kommt eine Speicherverletzung, das er diesen und jenen Speicherblock nicht lesen kann.
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; Sieht jemand von euch den Fehler? cu Sliver |
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:
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.
f:=GetProcAddress(handle,'fnDescreator');
cu Sliver |
Re: Speicherverltzung beim Laden einer DLL
Zitat:
extern "C" |
Re: Speicherverltzung beim Laden einer DLL
Zitat:
cu Sliver |
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.
|
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 13:35 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