![]() |
C-Structure in Delphi
Hi Leute!
Das was ich gerade probiere funktioniert nicht richtig. Ich nutzt Methodenaufrufe aus einer in C++ geschriebenen DLL und es kommt nur Blödsinn raus. Meine Vermutung ist, dass ich das Header-C-File nicht richtig übersetzt habe. Unsicher bin ich mir vorallem bei folgender Struktur: struct RW_Fahrzeug { short m_Typ; short nPrioritaet[RW_ANZ_KAT]; short nGeschwindigkeit[RW_ANZ_KAT]; unsigned short nVerbrauch[RW_ANZ_KAT]; long nSpritKostenL; long nZeitKostenH; long nWegKostenKM; long nFixKosten; long nTankfuellung; long nTankinhalt; long nBreite; long nHoehe; long nLaenge; long nGewicht; long nAchslast; long nSteigung; long nGefahrenklasse; }; Die klare Definition von nPrioritaet bis nVerbrauch und deren Werteübergabe sind mir nicht ganz klar. Natürlich habe ich dafür eine Idee, möchte die aber erst später in die Runde schmeißen. Zur Ausrichtung der Elemente der Struktur sind noch folgende Bemerkungen mitgegeben worden: ///////////////////////////////////////////////////////////////////////////// // Datentypen ///////////////////////////////////////////////////////////////////////////// // // Konstanten: Integer (4 Bytes) // // Variablen: // // Typ Bytes // ----------------- // int 4 // short 2 // long 4 // float 4 // double 8 // ///////////////////////////////////////////////////////////////////////////// // Anordnung der Strukturelemente ///////////////////////////////////////////////////////////////////////////// // // Die Elemente in den Strukturen sind auf 8-Byte-Grenzen ausgerichtet. // // Die Option Struct-Member-Ausrichtung (/Zpn) steuert, wie die Elemente einer // Struktur im Speicher abgelegt werden, und gibt dieselbe Ausrichtungsmethode // für alle Strukturen in einem Modul an. Wenn Sie diese Option angeben, wird // jedes Strukturelement nach dem ersten entweder in der Größe des Elementtyps // oder innerhalb der Grenzen von n-Bytes (wobei n den Wert 1, 2, 4, 8 oder 16 // haben kann) gespeichert, je nachdem, welches Element kleiner ist. Ich muß hier hinzufügen, dass ich Delphi 5 habe und somit über Compilerdirektive keine 8-Byte-ausrichtung erzwingen kann. Ich nutze hie die Einstellung "ausgerichtete Recordfelder". Das funktioniert an anderer Stelle tadellos. hier scheint das Problem erst mal nicht zu stecken. Gruß oki |
Re: C-Structure in Delphi
Vorweg: oki hat mir die Header-Dateien und Pascal-Übersetzung geschickt.
Zitat:
Zitat:
Code:
deklariert, was unter Delphi als stdcall bezeichnet wird. Du musst also alle cdecl durch stdcall ersetzen.
#define ROUTEWEG_API extern "C" __declspec (dllexport)
PS: Warum ich nicht auf deine PM geantwortet habe, lag daran, dass ich zum einen sehr beschäftig war und zum anderen keine Fehlerbeschreibung bei lag. |
Hi jbg,
dank für die erste Antwort. Das mit dem nicht so schnell melden nehm ich dir nicht übel. Ich bin selber im Vollstreß und kann das gut verstehen. Ich ersetz erst mal das cdecl und melde mich dann. Gruß oki |
Hi jbg,
ich hab cdecl durch stdcall ersetzt. Jetzt gehen fast alle Funktionen die im Header definiert sind mit Schreib-Lesefehlern auf Adresse in die Hose. Ich denke stdcall war es nicht. |
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
hier noch eine Bemerkung eines C-Programmierers aus dem Hause der DLL zum Thema Elementeausrichtung. Die Option Struct-Member-Ausrichtung (/Zpn) steuert, wie die Elemente einer Struktur im Speicher abgelegt werden, und gibt dieselbe Ausrichtungsmethode für alle Strukturen in einem Modul an. Wenn Sie diese Option angeben, wird jedes Strukturelement nach dem ersten entweder in der Größe des Elementtyps oder innerhalb der Grenzen von n-Bytes (wobei n den Wert 1, 2, 4, 8 oder 16 haben kann) gespeichert, je nachdem, welches Element kleiner ist. n ist bei uns 8, d. h. alle Variablen, die kleiner als 8 Bytes sind, werden direkt hintereinander in den Speicher geschrieben. Soll das bedeuten ich muß packed record verwenden? Gruß oki P.S. Ich häng mal die Original-Header-Datei sowie meine Übersetzung ran. |
Also, ich habs gerade mal mit packed record probiert. Wenn ich mir durch meine laufenden Änderungen nichts an anderer Stelle versaut hab, dann hat das nichts gebracht.
Gruß oki |
Hi Leute,
derzeit hab ich folgenden Stand. Die Records müssen als packed records deklariert und die Functionen mit cdecl importiert werden. Somit läuft erst mal alle ohne irgentwelche Abstürze. Leider liefert die Methode RW_Create kein Ergebnis. Meine Vermutung, dass ich die Parameter in der Struktur RW_Einstellungen für nPrioritaet, nGeschwindigkeit und nVerbrauch (wie oben als array) deklariert nicht so übergebe wie es sein muß. Ich häng mal meinen Aufruf hier ran.
Delphi-Quellcode:
Die Schleife zum füllen der Arrays hab ich hier mal testweise eingefügt.
function TRouteObject.RCreate(const re: TRW_Einstellungen;
fz: TRW_Fahrzeug; iModus: Longint): Longint; var Count : Integer; begin Result := RW_ORTAS_NO_ROUTEHANDLE; If FRW_WBHandle = 0 then Exit; for Count := 0 to 7 do begin fz.nPrioritaet[count] := 5; fz.nGeschwindigkeit[count] := 80; fz.nVerbrauch[count] := 9000; end; Result := RW_Create(FRW_WBHandle, re, fz, iModus); end; Der Import der Function RW_Create erfolgt bei mir so:
Delphi-Quellcode:
Vielleicht sieht hier irgentwo jemand einen Fehler.
function RW_Create(hWB: TRW_WBHANDLE;
re: TRW_Einstellungen; fz: TRW_Fahrzeug; iModus: Longint): Longint; cdecl; external 'RouteWeg.dll'; Anregungen zum testen würden mir auch schon weiter helfen. Also keine Angst wenn hier jemand eine Idee abliefert und es klappt damit nicht. Gruß oki |
Das packed muss auf alle Fälle weg, denn dadurch schrumpft die Struktur von 104 auf 102 Bytes. Die C Struktur ist jedoch 104 Bytes groß.
|
Hi jbg,
ich möchte dir ja gerne glauben (und gern auch begreifen), aber bei mir funzt ohne packed gar nichts. An welcher Stelle gehen die 2 Byte verschütt? Und wie ist dann die Bemerkung des C-Menschen zu verstehen, dass alle Daten direkt hintereinander stehen. (Sag mir mal einer auf welchen Knopf ich für Zitat drücken muß) Gruß oki |
Moin oki,
Zitat:
Rechts oben in der Titelzeile eines jeden Postings zu finden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 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