![]() |
Wie binde ich in C++ eine Delphi DLL ein?
Hallo miteinander,
ich habe mal ein umgekehrtes Problem. Ich möchte ganz gerne ein Delphi DLL in C++ einbinden. Ich habe noch gar keine Ahnung wie das aussehen mag. Ich hab's zwar mit HINSTANCE, LoadLibrary und GetProcAddress probiert, aber da kommen nur ständig Linker Fehlermeldungen raus: Die DLL in Delphi ist das bekannte Beispiel aus dsdt.info
Delphi-Quellcode:
Kann mir jemand mit dem Initialisierungscode in C++ helfen?library MyDll; uses Classes, SysUtils { add your units here }; function addiere(zahl1, zahl2: integer): integer; stdcall; begin addiere:=zahl1+zahl2 * 2; end; exports addiere; begin end. Danke, Gruß pajofego |
Re: Wie binde ich in C++ eine Delphi DLL ein?
In C++ gibt es verschiedene Varianten. Normalerweise würde man eine LIB-Datei von der DLL erstellen und den Linker anweisen diese LIB mit einzubinden.
Allerdings kannst du auch ganz normal über LoadLibrary und GetProcAddress alles so bekommen wie du willst. Hier mal die Prototypen:
Code:
(als Funktion addiere)
int __stdcall addiere(int zahl1, int zahl2);
Code:
(als Funktionstyp TFN_addiere)
typedef int (__stdcall * TFN_addiere)(int zahl1, int zahl2);
Sorry ... vielleicht doch noch ausführlicher ... Zum Laden sähe es in etwa wie folgt aus:
Code:
(ungetestet, einfach freihand)
TFN_addiere pfn_addiere = 0;
HANDLE hLib = LoadLibrary("DeineDll.dll"); if(hLib) { pfn_addiere = (TFN_addiere)(GetProcAddress(hLib, "addiere")); if(pfn_addiere) { int resultat = pfn_addiere(1,2); } FreeLibrary(hLib); } ... einfach eins tiefer schauen, kam fast gleichzeitig mit meiner Ergänzung |
Re: Wie binde ich in C++ eine Delphi DLL ein?
Oder dynamisch:
Code:
#include <iostream>
#include <windows.h> using namespace std; typedef int WINAPI (*myfunc_t)(int z1, int z2); myfunc_t addiere = NULL; int main() { HINSTANCE dll; dll = LoadLibrary("test.dll"); if (!dll) { cout << "LoadLibrary failed" << endl; return 0; } addiere = (myfunc_t) GetProcAddress( dll, "addiere"); if (!addiere) { cout << "GetProcAddress failed" << endl; return 0; } cout << "Hello world!" << endl; cout << addiere(4, 5) << endl; FreeLibrary(dll); return 0; } |
Re: Wie binde ich in C++ eine Delphi DLL ein?
mich würde die statiche Variante mit der LIB-Datei noch interessieren. Wie kann man für einer beliebigen DLL (bzw. die Delphi-DLL) so eine Lib-Datei erzeugen lassen und wie sieht die staatiche Einbindung dann aus?
|
Re: Wie binde ich in C++ eine Delphi DLL ein?
Der Linker sollte entsprechende Optionen zum Erzeugen anbieten. Kommt ja ganz stark auf deinen Compiler an. Für BCB wird da IMO direkt was mitgeliefert.
|
Re: Wie binde ich in C++ eine Delphi DLL ein?
Also ich habe einmal beide Ansätze von euch ausprobiert und ich bekomme stets Probleme mit dem Linker! Siehe unten. Es ist schon richtig, dass ich unter Projektoptionen dem Linker sage wo er "mydll.o" finden kann, oder fehlt da noch was?
" g++.exe -D__DEBUG__ main.o -o "TestDll.exe" -L"D:/Dev-Cpp/lib" mydll.o -g3 " Ich habe das ganze über den fpc.exe compiler durchgejagt (erstellen der DLL). Ich würde ganz gerne weiterhin den fpc (freepascal compiler) benutzen, damit ich das ganze auch mal unter Linux laufen lassen kann. Und da wäre ich schon bei meiner eigentlichen Frage. Das ganze mit den DLL ist ja für Windows. Wie sähe denn die Einbindung einer Linus Bibliothek für Linux aus? Danke, Gruß pajofego mydll.o(.text+0x20):mydll.lpr: undefined reference to `FPC_INITIALIZEUNITS' mydll.o(.data+0x30):mydll.lpr: undefined reference to `THREADVARLIST_SYSTEM' mydll.o(.data+0x34):mydll.lpr: undefined reference to `THREADVARLIST_OBJPAS' mydll.o(.data+0x38):mydll.lpr: undefined reference to `THREADVARLIST_RTLCONSTS' mydll.o(.data+0x3c):mydll.lpr: undefined reference to `THREADVARLIST_STRINGS' mydll.o(.data+0x40):mydll.lpr: undefined reference to `THREADVARLIST_DOS' mydll.o(.data+0x44):mydll.lpr: undefined reference to `THREADVARLIST_WINDOWS' mydll.o(.data+0x48):mydll.lpr: undefined reference to `THREADVARLIST_SYSCONST' mydll.o(.data+0x4c):mydll.lpr: undefined reference to `THREADVARLIST_SYSUTILS' mydll.o(.data+0x50):mydll.lpr: undefined reference to `THREADVARLIST_TYPES' mydll.o(.data+0x54):mydll.lpr: undefined reference to `THREADVARLIST_TYPINFO' mydll.o(.data+0x58):mydll.lpr: undefined reference to `THREADVARLIST_CLASSES' mydll.o(.data+0x64):mydll.lpr: undefined reference to `RESOURCESTRINGLIST_RTLCONSTS' mydll.o(.data+0x68):mydll.lpr: undefined reference to `RESOURCESTRINGLIST_SYSCONST' mydll.o(.data+0x74):mydll.lpr: undefined reference to `INIT$_SYSTEM' mydll.o(.data+0x78):mydll.lpr: undefined reference to `FINALIZE$_SYSTEM' mydll.o(.data+0x7c):mydll.lpr: undefined reference to `INIT$_OBJPAS' mydll.o(.data+0x80):mydll.lpr: undefined reference to `FINALIZE$_OBJPAS' mydll.o(.data+0x84):mydll.lpr: undefined reference to `INIT$_DOS' mydll.o(.data+0x8c):mydll.lpr: undefined reference to `INIT$_SYSUTILS' mydll.o(.data+0x90):mydll.lpr: undefined reference to `FINALIZE$_SYSUTILS' mydll.o(.data+0x94):mydll.lpr: undefined reference to `INIT$_TYPINFO' mydll.o(.data+0x98):mydll.lpr: undefined reference to `FINALIZE$_TYPINFO' mydll.o(.data+0x9c):mydll.lpr: undefined reference to `INIT$_CLASSES' mydll.o(.data+0xa0):mydll.lpr: undefined reference to `FINALIZE$_CLASSES' collect2: ld returned 1 exit status make.exe: *** [TestDll.exe] Error 1 Ausführung beendet |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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