![]() |
AW: C DLL mit Delphi verwenden
Sorry ich bezog mich auf dieses theoretisch beschrieben Struct:
Zitat:
Code:
und hier ist mein Delphi-Code dazu:
typedef struct {
UINT8 deviceType [MAX_DEVICE_TYPE_LENGTH + 1]; UINT8 orderId [MAX_ORDER_ID_LENGTH + 1]; UINT16 hwRevision; UINT8 swRevisionPrefix; UINT16 swRevision1; UINT16 swRevision2; UINT16 swRevision3; } ATTR_PACKED ANNOTATION;
Delphi-Quellcode:
Wie oben gesagt, hatte ich schon mit dem alignment "gespielt", aber bin zu keinem Ergebnis gekommen... nur nen Haufen Schutzverletzungen:(
TAnnotation =
packed record deviceType : array[0..MAX_DEVICE_TYPE_LENGTH] of UINT8; orderId : array[0..MAX_ORDER_ID_LENGTH] of UINT8; hwRevision : UINT16; swRevisionPrefix : UINT8; swRevision1 : UINT16; swRevision2 : UINT16; swRevision3 : UINT16; end; |
AW: C DLL mit Delphi verwenden
Das packed muß hier definitiv raus. Wegen orderId und swRevisionPrefix.
Du kannst es auch so deklarieren (hier ist dann packed oder nicht egal):
Delphi-Quellcode:
TAnnotation =
packed record deviceType : array[0..MAX_DEVICE_TYPE_LENGTH] of UINT8; orderId : array[0..MAX_ORDER_ID_LENGTH] of UINT8; padding1 : UINT8; hwRevision : UINT16; swRevisionPrefix : UINT8; padding2 : UINT8; swRevision1 : UINT16; swRevision2 : UINT16; swRevision3 : UINT16; end; |
AW: C DLL mit Delphi verwenden
Danke, das hatte ich mir schon gedacht und gestern angefangen alle Structs zu suchen, wo ich das padding einführen muss. Echt fies diese Sache...
Ich hab angefangen in C mit sizeof und offsetof die Daten zu prüfen. Mal sehen, ob dann sich das Callback zurückmeldet... |
AW: C DLL mit Delphi verwenden
Also das Padding hat schon mal weiter geholfen, aber jetzt bekomme ich bei dem Callback ziemlich viel Müll in den Parametern übergeben.
Ich hab mich bis jetzt noch wenig mit dem CPU-Fenster der Delphi 7 IDE beschäftigt. Wie kann ich sehen, welche Daten von Delphi an die DLL übergeben und welche von der DLL zurückkommen? Kann mir da jemand weiterhelfen (Link auf nen Post aus dem Forum oder so...) |
AW: C DLL mit Delphi verwenden
|
AW: C DLL mit Delphi verwenden
Das Problem mit der Dll ist gelöst.
Das Problem ist folgendes: Die Aufrufe für die Methoden der DLL sind alle als stdcall deklariert, ABER die Callback Functions, die aus der DLL heraus aufgerufen werden, sind nicht explizit mit einer Aufrufkonvention versehen. Also greift die Aufrufkonvention die als default für den Compiler der DLL eingestellt war und das war in meinem Fall cdecl... Ich bekomme jetzt zumindest keine Zugriffsverletzungen mehr, jetzt muss ich nur noch schauen, ob auch wirklich ale C-Structs beim Umsetzen in Delphi-Records richtig gepadded sind... Ich hoffe meine Erkenntnis hilft anderen weiter, die ähnliche Probleme haben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 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