Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C++ Wie binde ich in C++ eine Delphi DLL ein? (https://www.delphipraxis.net/69134-wie-binde-ich-c-eine-delphi-dll-ein.html)

pajofego 10. Mai 2006 17:09


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:

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.
Kann mir jemand mit dem Initialisierungscode in C++ helfen?

Danke,

Gruß

pajofego

Olli 10. Mai 2006 17:22

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:
int __stdcall addiere(int zahl1, int zahl2);
(als Funktion addiere)

Code:
typedef int (__stdcall * TFN_addiere)(int zahl1, int zahl2);
(als Funktionstyp TFN_addiere)

Sorry ... vielleicht doch noch ausführlicher ...

Zum Laden sähe es in etwa wie folgt aus:

Code:
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);
}
(ungetestet, einfach freihand)

... einfach eins tiefer schauen, kam fast gleichzeitig mit meiner Ergänzung

sniper_w 10. Mai 2006 17:32

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;
}

SirThornberry 10. Mai 2006 18:36

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?

Olli 10. Mai 2006 21:01

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.

pajofego 10. Mai 2006 21:35

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