![]() |
Delphi-Version: 5
Delphi-DLL in C++ verwenden, Headerdatei?
Servus zusammen. An sich kann ich Delphi, aber Delphi-Interop nach C++ ist ein Problem. Dummerweise ist Google hier leidlich hilfreich. Mir geht es darum, eine Delphi-DLL in C++ zu verwenden. Und zwar nicht nur Funktionen (dafür findet man eine ganze Menge), sondern auch Datenstrukturen, um genau zu sein Records. Hat jemand einen Link zu einem ausführlichen Tutorial zu dem Thema?
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Records sind doch kein Problem solange du keine Delphi-Eigenheiten/Strings verwendest und mit packed das Speicherlayout fest legst.
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Hallo -
Ein eigentlich ganz nettes Tutorial zum Thema DLLs und Delphi ist unter ![]() zu finden. Zumindest kenne ich sonst keins, was sonst unter "ausführlich" fallen würde. :oops: Ansonsten ist ein Delphi-Record doch die Ensprechung eines struct auf C++-Seite, da kannst du eigentlich gefahrlos Pointer hin- und herschieben. Nur schau dir vorher die Datentypen in Delphi genau an. Oder was genau meintest du mit "Strukturen verwenden"? |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Ich habe hier z.B. einen Header, in dem die Delphirecords auf Structs übertragen werden, in dem hinten ein void print(char *) auftaucht. Warum, weiss niemand. Irgendeinen Zweck hat es aber, sonst wäre es nicht da.
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Ein Zeiger auf Char ist ein nullterminierter String in c
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Aber was macht es? Warum ist ein Delphirecord aus zwei Bytes in C eine Struktur mit zwei Bytes und einem void print(char *)?
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Ich komme nicht hinterher.
Was ist das Problem? Dass (unklarerweise) irgendjemand der struct-Entsprechung auf C-Seite noch eine Methode print gegeben hat? Wie ist die Methode denn implementiert? Außerdem: C oder C++? Wenn ich nicht vollkommen danebenliege, durfen in C doch structs noch keine Methoden haben, oder? |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Es ist C++.
Das Problem ist: warum? Was macht es? Warum ist es da? Warum stört es nicht? Oder stört es vielleicht doch? Implementiert ist es meines Wissens nach in der Standardbib. |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Wenn in C++ eine Funktionsdeklaration in einer Struktur steht, ist es eine Klassendeklaration.
Denn
Code:
ist das gleiche wie
struct A
{ void print(char *); };
Code:
D.h. es werden implizit noch Konstruktor, Kopierkonstruktor, Destruktor, Zuweisungsoperator und in C++11 noch Movekonstruktor, usw. generiert.
class A
{ public: void print(char *); }; C++ Klassen in DLL-Schnittstellen sind nicht binärkompatibel zwischen verschiedenen Compilern. Zitat:
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Ich fasse nochmal zusammen:
Jetzt das Problem: Dieser Nette Mensch hat dem C++-struct noch eine Methode void print(char*) mitgegeben. Das stiftet Verwirrung. Hätte die Methode keine Parameter und einen Rückgabewert hätte ich angenommen, dass es eine Art .toString() ist, die einfach nur den Inhalt der Struktur ausgibt, aber so :? Die Methode muss doch irgendwo implementiert sein. Gehört die Methode wirklich zum struct, muss sie auch irgendwo implementiert sein. Oder ist es nur eine Forward-Deklaration und hat damit nichts zu tun? Kannst du nicht ein bisschen konkreten Quelltext zeigen? |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Zitat:
Außerdem wäre da noch das Problem, wie die Methoden denn heißen: ![]() Man sollte sich für solche Schnittstellen mit einfachen Funktionen (in C++ mit extern "C" deklariert) und Strukturen nur mit einfachen Datentypen begnügen, so wie die WinAPI das macht. |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Ein Bisschen Quelltext:
Code:
ist die Abbildung von
typedef struct {
unsigned char Day; unsigned char Month; char DueDateYearTakeOverTime[5+1]; void print(char *); } DueDate;
Code:
_TStichtag = record
Tag, Monat : byte; Jahresstichtag_Uebernahmezeit : array[0..MAX_LEN_TSTICHTAG_JS_UEB_ZEIT] of AnsiChar; end; |
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Das typedef struct spricht für C, in C++ würde man das ohne typedef als
Code:
schreiben.
struct DueDate
So wie es da mit der Member Funktion steht, ist es aber eine merkwürdige Deklaration einer C++ Klasse. Eine Implementierung von print muss es noch irgendwo geben. Wäre es eine Interface Klasse stände da
Code:
virtual void print(char *) = 0;
|
AW: Delphi-DLL in C++ verwenden, Headerdatei?
Entweder habe ich noch zu wenig Koffeein intus oder in deiner .C (oder .cpp oder was auch immer)-Datei wirst du ein
Code:
finden. Dort steht dran drin, was diese Methode im struct eigentlich bewirkt. :wink:
void DueDate::print(char *){
[...] } In C++ sehe ich aber auch so weiterhin sehr viele struct-Deklarationen mittels typedef. Mit alte Gewohnheiten bricht man wohl nur schwer... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 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