Ergebnis 1 bis 6 von 6

Thema: record/struct als Rückgabewert eine DLL-Funktion

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    Zitat Zitat von Ineluki Beitrag anzeigen
    Im Header definierst du keinen Variablentyp TMyRecord, sondern einen struct vom Typ MyRecord und eine Variable TMyRecord vom typ MyRecord.
    (Falls ich gerade Bloedsinn schreibe [...])
    Ja, tust du. :P

    Code:
    typedef struct MyRecord {
        int A;
        int B;
    } TMyRecord;
    Hier wird die Struktur MyRecord definiert und ihr "Alias" TMyRecord. TMyRecord ist aber keine Definition einer Variablen im Speicher.


    @Desmulator:

    In Win32 ist die Aufrufkonvention für exportierte Funktionen aus DLLs __stdcall und das ist Pflicht. Die Definitionen dieser Funktionen innerhalb der DLLs und die Deklarationen in den ABIs müssen selbstverständlich in der Aufrufkonvention übereinstimmen. Man sollte sich jedoch nicht darauf verlassen, dass jeder Compiler/jedes Projekt dieselben Einstellungen besitzt und die Aufrufkonvention explizit angeben.

    Die Aufrufkonvention ist allerdings nur eine Hürde von ABIs, eine weitere wäre die Speicherausrichtung. Wenn du verschiedene Compiler zulassen möchtest (das gilt sowohl für die FreePascal-Compiler, als auch für die C/C++-Compiler), musst du sicherstellen, dass Padding für zusammengesetzten Datentypen äquivalent aussieht. Eine Möglichkeit dies zu tun wäre Padding ganz auszuschalten, indem du die Ausrichtung während der Deklaration auf '1' setzt, allerdings mit dem bitteren Nachgeschmack, dass die Anweisungen dafür compilerabhängig sind und, dass fehlende Speicherausrichtung die Performance drücken kann, falls man mit den nicht ausgerichteten Datentypen in performancekritischen Schleifen arbeitet.
    Für das letztere Problem, falls es eintreten kann, kannst du einfach Objekte mit nicht ausgerichteten Membern in Objekte mit ausgerichteten Membern umwandeln.
    Für das erstere Problem musst du mit Präprozessordirektiven den Compiler feststellen und z.B. wie folgt (in C/C++) auflösen:

    Code:
    #ifdef _MSC_VER // VC++
    #pragma pack(push, 1)
    struct STRUCT_NAME
    {
        STRUCT_BODY
    };
    #pragma pack(pop)
    #else // assume gcc
    struct STRUCT_NAME
    {
        STRUCT_BODY
    } __attribute__((packed));
    #endif
    Was DLLs angeht, solltest du unbedingt auch aufpassen die DLL-Boundary nicht zu verletzen, also Daten, die innerhalb der DLL alloziert wurden auch innerhalb der DLL wieder freigeben.

    Geändert von Kyuu (27.06.2009 um 15:50 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •