2017-01-11 1 views
-1

Ich schreibe eine Reihe von DLLs, mit denen andere Entwickler ihre eigene DLL als Erweiterung schreiben können. Im Delphi-Code verwende ich häufig Enums und Enum-Sets. Ich benutze enums durch DLLs. Ich weiß, dass ich ein enum durch eine DLL über verschiedene Projekte, die mit Delphi kompiliert werden, sicher verwenden kann. Ich bin mir jedoch nicht sicher, wie anpassungsfähig es in verschiedenen Sprachen ist.Ist es sicher, Enums über Interop-Grenzen hinweg zu verwenden?

Ist es sicher, Enums über eine DLL zu verwenden, während andere Sprachen unterstützt werden? Oder sollte ich es stattdessen als Integer ausgeben?

+3

Aufzählungen müßten als ordinals weitergegeben werden, und Ihr Delphi-Code sollte mit [{$ MINENUMSIZE}] (http://docwiki.embarcadero.com/RADStudio/Berlin/en/Minimum_enumeration_size_%28Delphi%29) zu Stellen Sie sicher, dass Sie die Ordnungszahl der richtigen Größe verwenden, um plattformübergreifend kompatibel zu sein. Delphi packt Enums je nach Anzahl der Elemente in der Enumeration in unterschiedliche Byte-Größen, was dazu führen kann, dass einige Probleme mit Nicht-Delphi-Code hin- und hergereicht werden. –

+0

Verwenden Sie für Interop min enum 4, da C enums nur int sind. –

+0

@David: Laut C99 können sie kleiner als int sein, wenn der Compiler das will. Aber unter Windows werden sie alle 4 Byte (int) groß sein. –

Antwort

1

Enums müssen als Ganzzahlen (Word oder DWORD) übergeben werden, und Sie sollten die Compiler-Direktive {$MINENUMSIZE} (AKA {$Z}) verwenden, um sicherzustellen, dass sie die richtige Größe haben. Der Delphi-Compiler verwendet unterschiedliche Größen basierend auf der Anzahl der Aufzählungswerte, wenn Sie dies nicht tun.

Wenn Sie mit dem C/C++ - Code unter Windows arbeiten möchten, verwenden Sie {$MINENUMSIZE 4}.

Die Dokumentation I über Adressen Interop mit C/C++ verknüpft - siehe den dritten Absatz:

Die $ Z-Richtlinie regelt die Mindestspeichergröße von Delphi-Typen aufgezählt.

Ein Aufzählungstyp wird als vorzeichenloses Byte gespeichert, wenn die Aufzählung nicht mehr als 256 Werte enthält und wenn der Typ im Status {$ Z1} (Standard) deklariert wurde. Wenn ein Aufzählungstyp mehr als 256 Werte aufweist oder der Typ im Status {$ Z2} deklariert wurde, wird er als vorzeichenloses Wort gespeichert. Wenn schließlich ein Aufzählungstyp im Status {$ Z4} deklariert ist, wird er als vorzeichenloses Doppelwort gespeichert.

Die Zustände {$ Z2} und {$ Z4} sind nützlich für die Schnittstelle mit C- und C++ - Bibliotheken, die normalerweise aufgezählte Typen als Wörter oder Doppelwörter darstellen.

Verwandte Themen