Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C DLL mit Delphi verwenden (https://www.delphipraxis.net/158554-c-dll-mit-delphi-verwenden.html)

Beowulf01 23. Feb 2011 07:19

AW: C DLL mit Delphi verwenden
 
Sorry ich bezog mich auf dieses theoretisch beschrieben Struct:

Zitat:

Ich habe eben festgestellt, dass bei einem MethodenAufruf eine C-Struktur 58 Byte groß ist und die dazugehörige Delphi-Struktur nur 56 Byte.

Die Struktur besteht aus :

Byte-Array (26 Bytes)
Byte-Array (21 Bytes)
Word ( 2 Bytes)
Byte ( 1 Byte )
Word ( 2 Bytes)
Word ( 2 Bytes)
Word ( 2 Bytes)

In Delphi habe ich ein Packed Record draus gemacht, aber in C wir die Direktive

#pragma pack( push, safe_old_packing, 4 )

verwendet.
Hier ist der C-Quellcode
Code:
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;
und hier ist mein Delphi-Code dazu:

Delphi-Quellcode:
  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;
Wie oben gesagt, hatte ich schon mit dem alignment "gespielt", aber bin zu keinem Ergebnis gekommen... nur nen Haufen Schutzverletzungen:(

Assarbad 23. Feb 2011 16:29

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;

Beowulf01 24. Feb 2011 06:02

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...

Beowulf01 24. Feb 2011 08:42

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...)

Beowulf01 24. Feb 2011 08:58

AW: C DLL mit Delphi verwenden
 
Selbst gefunden...
http://www.delphipraxis.net/41047-tu...ortgeschr.html

Beowulf01 26. Feb 2011 09:41

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.
Seite 2 von 2     12   

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