![]() |
Record aus Delphi-Dll in C++
Hi,
ich schreibe gerade eine Delphi-Dll, in der ich folgende Funktion habe:
Delphi-Quellcode:
Die Deklaration in C++ sieht folgendermaßen aus:
procedure GetSatz(var Value: Satz); stdcall;
begin Value.Value1 := Temp.Value1; Value.Value2 := Temp.Value2; end;
Code:
Wenn ich allerdings die Funktion aufrufe, dann kommt eine Fehlermeldung:
#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 Test.exe hat ein Problem festgestellt und muss beendet werden. |
Re: Record aus Delphi-Dll in C++
mal so aus dem Bauch:
wenn du in Delphi schreibst
Delphi-Quellcode:
muss es dann nicht in C++ heißen
(var Value: Satz)
(Satz *Value) btw. finde einen Typ "Satz" nicht gerade aussagekräftig, wieso nicht was a lá "TCustomer" oder so ? gruß Roderich |
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. |
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:
Und wieder dieser Fehler...:wall: Liegt das vielleicht an diesen Alignment? Was hat es damit auf sich?
DllExport Satz __stdcall GetSatz2(void);
Btw.: Ich teste das nur, deshalb die blöden nixsagenden Variablen- und Typenbezeichner... |
Re: Record aus Delphi-Dll in C++
Zitat:
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:
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.
#pragma pack (push, 1)
// Struct Deklaration #pragma pack (pop) |
Re: Record aus Delphi-Dll in C++
Zitat:
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? |
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? |
Re: Record aus Delphi-Dll in C++
Beide 8 Byte...
|
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) |
Re: Record aus Delphi-Dll in C++
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz