AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ Wie binde ich in C++ eine Delphi DLL ein?

Wie binde ich in C++ eine Delphi DLL ein?

Ein Thema von pajofego · begonnen am 10. Mai 2006 · letzter Beitrag vom 10. Mai 2006
Antwort Antwort
pajofego

Registriert seit: 6. Okt 2004
103 Beiträge
 
#1

Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 17:09
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 17:22
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
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 17:32
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;
}
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 18:36
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#5

Re: Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 21:01
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.
  Mit Zitat antworten Zitat
pajofego

Registriert seit: 6. Okt 2004
103 Beiträge
 
#6

Re: Wie binde ich in C++ eine Delphi DLL ein?

  Alt 10. Mai 2006, 21:35
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:55 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