AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record aus Delphi-Dll in C++

Ein Thema von Stevie · begonnen am 22. Jul 2004 · letzter Beitrag vom 22. Jul 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 10:40
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#2

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 10:46
mal so aus dem Bauch:
wenn du in Delphi schreibst

(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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 11:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 11:18
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... 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...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#5

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 11:59
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 12:11
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?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 13:39
Lass dir mal im Delphi und C++-Programm die größe des Records mittels GetSize anzeigen.
Sind diese Werte gleich?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 13:48
Beide 8 Byte...
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 13:51
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)
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#10

Re: Record aus Delphi-Dll in C++

  Alt 22. Jul 2004, 15:36
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 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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 09:27 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