Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi DLL in C++ Builder (https://www.delphipraxis.net/100613-delphi-dll-c-builder.html)

Tim Henford 1. Okt 2007 13:56


Delphi DLL in C++ Builder
 
Hallo,

ich wollte meine Delphi DLL in ein C++ Builder einbinden. Wie rufe ich meine DLL Funktion dann statisch auf?

Es hiess auf ein anderen Seite:
@In diesem Falle sollte Dir die .lib und .h Datei zu Deiner Dll zur Verfügung stehen. Ist aber kein Problem da Du ja die Dll selber geschrieben hast.
Füge die .lib Datei Deinem C++ Projekt hinzu, kopiere die Headerdatei und die Dll in dein Projektverzeichnis."

Aber sowas gibt es doch bei Delphi nicht, oder?

Und wie ist es mit der ersten Sharemem Unit, wie geht das mit C++ Builder?


Delphi-Quellcode:

function Summe(a, b: integer): integer;
begin
  result:= a+b;
end;

exports Summe;

begin
end.

DMW 2. Okt 2007 14:49

Re: Delphi DLL in C++ Builder
 
Zitat:

Zitat von Tim Henford
Aber sowas gibt es doch bei Delphi nicht, oder?

Doch: du kannst Delphi veranlassen, Header- und .lib-Dateien für C++Builder zu generieren (Linker Options, "Generate C++ object files", "Export all symbols" und "Include namespaces").


Zitat:

Zitat von Tim Henford
Und wie ist es mit der ersten Sharemem Unit, wie geht das mit C++ Builder?

Dazu äußert sich C++Builder, wenn du ein leeres DLL-Projekt erstellst:
Code:
//---------------------------------------------------------------------------
//   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
//   Version der Laufzeitbibliothek (RTL) verwendet:
//
//   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
//   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
//   muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
//   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
//   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
//   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
//   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
//   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
//   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
//
//   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
//   ShortString-Parameter weitergegeben werden.
//
//   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
//   MEMMGR.LIB nicht explizit angeben.
//---------------------------------------------------------------------------

Tim Henford 4. Okt 2007 13:50

Re: Delphi DLL in C++ Builder
 
Super, danke. Nur mal so: geht das mit MS VC++ auch mit der MEMMGR.LIB?

Delphi erstellt nun die *.obj dabei scheint der Compiler aber auch immer mal einen CompilerFehler LE40 oder so zu bringen.
Mit C++ kann ich nun die obj einbinden?

DMW 7. Okt 2007 19:05

Re: Delphi DLL in C++ Builder
 
Zitat:

Zitat von Tim Henford
Super, danke. Nur mal so: geht das mit MS VC++ auch mit der MEMMGR.LIB?

Nein. VC verwendet einen eigenen, inkompatiblen Speichermanager sowie ein inkompatibles LIB-Format (COFF anstatt OMF), und überdies ein anderes Objektstrukturformat, weshalb nicht-POD-Typen nicht austauschbar sind (was z.B. auch für AnsiString gilt).

Zitat:

Zitat von Tim Henford
Mit C++ kann ich nun die obj einbinden?

Ja; die Objektdatei einfach dem Projekt hinzufügen (für den Linker) und die Headerdatei, wo benötigt, mittels #include einbinden.

Apollonius 7. Okt 2007 19:16

Re: Delphi DLL in C++ Builder
 
Du solltest die Aufrufkonvention von Summe ändern. In Delphi ist Register der Standard, Register gibt es in C++ aber nicht. Nimm entweder Stdcall oder cdecl.

DMW 8. Okt 2007 16:37

Re: Delphi DLL in C++ Builder
 
Der generierte Header ist speziell für C++Builder, und dort erhält die Funktion dann automatisch die äquivalente __fastcall-Aufrufkonvention. Soll die Funktion aber von VC oder einem anderen Compiler aus benutzt werden können (wobei sich die genannten Einschränkungen ergeben), solltest du die Aufrufkonvention tatsächlich in Delphi anpassen.


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