Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record aus Delphi-Dll in C++ (https://www.delphipraxis.net/26334-record-aus-delphi-dll-c.html)

Stevie 22. Jul 2004 09:40


Record aus Delphi-Dll in C++
 
Hi,

ich schreibe gerade eine Delphi-Dll, in der ich folgende Funktion habe:
Delphi-Quellcode:
procedure GetSatz(var Value: Satz); stdcall;
begin
  Value.Value1 := Temp.Value1;
  Value.Value2 := Temp.Value2;
end;
Die Deklaration in C++ sieht folgendermaßen aus:
Code:
#ifndef DLL_H
#define DLL_H

#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)

typedef struct {
  int Value1;
  int Value2;
} Satz;

#ifdef __cplusplus
extern "C" { 
#endif

DllExport Satz __stdcall GetSatz(Satz Value);

#ifdef __cplusplus

#endif

#endif
Wenn ich allerdings die Funktion aufrufe, dann kommt eine Fehlermeldung:
Test.exe hat ein Problem festgestellt und muss beendet werden.

roderich 22. Jul 2004 09:46

Re: Record aus Delphi-Dll in C++
 
mal so aus dem Bauch:
wenn du in Delphi schreibst

Delphi-Quellcode:
(var Value: Satz)
muss es dann nicht in C++ heißen
(Satz *Value)



btw. finde einen Typ "Satz" nicht gerade aussagekräftig, wieso nicht was a lá "TCustomer" oder so ?

gruß Roderich

Bernhard Geyer 22. Jul 2004 10:02

Re: Record aus Delphi-Dll in C++
 
Auch solltest Du kontrollieren, ob das Alignment in beine Projekten gleich ist.
Records werden je nach Delphi-Version und Einstellung auf 1-8 Bytes ausgerichtet. Und wenn das nicht passt - dann kanns auch krachen.

Die größe der Records kannst Du mit der GetSize-Funktion kontrollieren.

Stevie 22. Jul 2004 10:18

Re: Record aus Delphi-Dll in C++
 
Ok, danke, das hat funktioniert, wenn ich auch in C++ nur den Pointer übergebe...
Jetzt hab ich folgende Funktion:
Delphi-Quellcode:
function GetSatz2: Satz; stdcall;
begin
  Result := Temp;
end;
Code:
DllExport Satz __stdcall GetSatz2(void);
Und wieder dieser Fehler...:wall: Liegt das vielleicht an diesen Alignment? Was hat es damit auf sich?
Btw.: Ich teste das nur, deshalb die blöden nixsagenden Variablen- und Typenbezeichner...

OregonGhost 22. Jul 2004 10:59

Re: Record aus Delphi-Dll in C++
 
Zitat:

DllExport Satz __stdcall GetSatz2(void);
Wenn du das in der C++-Anwendung IMPORTierst, müsste das dann nicht DllImport heißen?
Insofern wundere ich mich ein wenig, dass das Programm überhaupt gelinkt wird. Oder trübt mich meine Erinnerung da...

Am Alignment (Ausrichtung im Speicher) kann's natürlich liegen. Ich glaube, die einfachst Lösung in Delphi ist, den Record als packed record zu deklarien. Im C++ ist das dann aber glaube ich Compiler-spezifisch. Beim Visual C++ ging's so:
Code:
#pragma pack (push, 1)
// Struct Deklaration
#pragma pack (pop)
Oder du findest raus, wie das Alignment bei dem Delphi-Compiler ist, und stellst es für das C++-Programm als Compiler-Option ein. Beim Visual C++ kannst du das in den Projektoptionen auswählen.

Stevie 22. Jul 2004 11:11

Re: Record aus Delphi-Dll in C++
 
Zitat:

Zitat von OregonGhost
Zitat:

DllExport Satz __stdcall GetSatz2(void);
Wenn du das in der C++-Anwendung IMPORTierst, müsste das dann nicht DllImport heißen?
Insofern wundere ich mich ein wenig, dass das Programm überhaupt gelinkt wird. Oder trübt mich meine Erinnerung da...

Das hat mich am Anfang auch etwas verwirrt, aber das import bzw. export bezieht sich auf die Dll, also ein Export aus der Dll.

Mit dem Pragma hat's auch nicht funktioniert.
Wo bekomme ich die Einstellung für das Alignment in Delphi denn her? Liegt's denn überhaupt daran?

Bernhard Geyer 22. Jul 2004 12:39

Re: Record aus Delphi-Dll in C++
 
Lass dir mal im Delphi und C++-Programm die größe des Records mittels GetSize anzeigen.
Sind diese Werte gleich?

Stevie 22. Jul 2004 12:48

Re: Record aus Delphi-Dll in C++
 
Beide 8 Byte...

Bernhard Geyer 22. Jul 2004 12:51

Re: Record aus Delphi-Dll in C++
 
Dann liegt es nicht am Alignment, sondern an der Definition der Funktionen in Delphi/C++.
Aber da kann ich keine Tipps geben (bzw. die Tipps, die schon aufgeführt sind).
Es könnte jedoch noch an der Aufrufkonvention liegen. Aber was Du da in der C++-Header-Datei angeben mußt, weiß ich nicht auswendig (ist schon so lange her meine C/C++-Zeit)

OregonGhost 22. Jul 2004 14:36

Re: Record aus Delphi-Dll in C++
 
Zitat:

Zitat von Microsoft
Beim Erstellen Ihrer DLL gehen Sie in der Regel so vor, daß Sie eine Header-Datei mit den Funktionsprototypen und/oder den zu exportierenden Klassen erstellen und anschließend __declspec(dllexport) zu den Deklarationen in der Header-Datei hinzufügen.

Zitat:

Zitat von Microsoft
Allerdings müssen Sie __declspec(dllimport) verwenden, wenn die importierende ausführbare Datei auf die öffentlichen Datensymbole und Objekte der DLL zugreifen muß.

Ist ja wohl widernatürlich, dllexport zum Importieren zu verwenden, es sei denn, der C++-Code ist in Wirklichkeit die exportierende DLL. Ich weiß natürlich nicht, was deinen C++-Compiler reitet (welchen verwendest du denn?), wenn er den Export kompiliert bzw. linkt, ohne dafür eine Definition zu haben. Meiner macht das jedenfalls nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Seite 1 von 2  1 2      

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