Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eine in C geschriebene DLL in Delphi verwenden (https://www.delphipraxis.net/33029-eine-c-geschriebene-dll-delphi-verwenden.html)

schlock 31. Okt 2004 18:11


Eine in C geschriebene DLL in Delphi verwenden
 
Hallo,
ich habe eine in C geschrieben DLL die ich Delphi nutzen will. Die DLL heist MCMDLL.dll und es liegt noch ein C-Header File als Information vor welche folgende Funktion enthalten sind. U.a.
findet man dort
Code:
MCM_API const char *  __stdcall ML_DllVersion(void);
Die Funktion gibt es auch wircklich in der DLL, was man mit in einer DOS-Shell mit
Code:
tdump MCMDLL.dll MCMDLL.txt
rausbekommt. Dabei erhält für obige Funktion den Eintrag
Code:
 RVA      Ord Hint Name
 --------  --- ---- ----------------
 00004F20  173 00AC _ML_DllVersion@0

Die Funktion wollte ich dann statisch mit
Delphi-Quellcode:
function _ML_DllVersion:PChar; external 'MCMDLL.dll';
einbinden, und bei Knopfdruck per
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  MessageDlg(ML_DllVersion, mtWarning, [mbOK], 0);
end;
die DLL Version anzeigen lassen. Dies führt aber immer zu dem Fehler:
Zitat:

Der Prozedureinstiegspunkt ML_DllVersion wurde in der DLL MCMDLL.dll nicht gefunden.
Ich hab das gleiche auch mit dem Funktionsnamen _ML_DllVersion probiert. Es kam exakt der gleiche Fehler.

Hat jemand eine Idee ????

fiasko 31. Okt 2004 18:14

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Mal probiert das in Delphi auch als stdcall zu deklarieren?

Dax 31. Okt 2004 18:14

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Versuchs mal so:
Delphi-Quellcode:
function _ML_DllVersion:PChar; external 'MCMDLL.dll' index 173; stdcall;
Denn laut deinem DOS-Dump hat die Funktion den Index 173.. Wahrscheinlich hat der Compiler die Funktion intern umbenannt.

schlock 31. Okt 2004 18:26

Re: Eine in C geschriebene DLL in Delphi verwenden
 
So gehts nicht:
Delphi-Quellcode:
function _ML_DllVersion:PChar; external 'MCMDLL.dll' index 173; stdcall;
Aber so:
Delphi-Quellcode:
function _ML_DllVersion:PChar; stdcall; external 'MCMDLL.dll' index 173;
:bounce2:


Vielen Dank.

Robert Marquardt 31. Okt 2004 20:32

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Delphi-Quellcode:
function ML_DllVersion: PChar; cdecl; external 'MCMDLL.dll' name '_ML_DllVersion@0';
So gehts richtig. Den Namen so angeben wie er exportiert wird.
Der _ deutet an das die Calling Convention nicht stdcall ist, sondern cdecl.

w3seek 31. Okt 2004 20:36

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Zitat:

Zitat von Robert Marquardt
Der _ deutet an das die Calling Convention nicht stdcall ist, sondern cdecl.

Ist es allerdings nicht zwangslaeufig grundsaetzlich so, in diesem fall wurde die funktion explizit als __stdcall deklariert :!:

Robert Marquardt 31. Okt 2004 20:44

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Na dann hat mal wieder jemand bei der Erstellung der DLL nicht auf die Compileroptionen geachtet.
Das ist wirklich ein grosser Mist bei MS.

w3seek 31. Okt 2004 21:32

Re: Eine in C geschriebene DLL in Delphi verwenden
 
Die Funktionsnamen haben rein gar nichts mit der Aufrufkonvention gemeinsam. Dass der "_" Tiefstrich ueblicherweise nicht in __stdcall Funktionen verwendet wird ist eher Zufall bzw eine interne Regelung. Genausowenig ist es bei __cdecl Funktionen Zwang einen _ im Namen zu haben. Das hat nichts mit Schlampigkeit zu tun, es gibt einfach keine Regeln fuer die Namensgebung. Die einzige Ausnahme wo man zu 99% auf __cdecl schliessen kann sind mangled C++ Funktionsnamen (So dass es moeglich ist ueberladene Funktionen zu exportieren) die aussehen wie z.B. ??0__non_rtti_object@@QAE@ABV0@@Z - allerdings ist das auch keine Garantie fuer __cdecl, aber man kann sich da aber zu 99.9% sicher sein, da die C++-Compiler solche Funktionen normalerweise grundsaetzlich als __cdecl exportieren.


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