Announcement

Collapse
No announcement yet.

Probleme beim Aufruf einer C-DLL, Zeiger und Datentypen ??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme beim Aufruf einer C-DLL, Zeiger und Datentypen ??

    Hallo,

    ich versuche verzweifelt eine C-DLL mit D5 zu verwenden.
    Manche Befehle funktionieren wunderbar, bei anderen hab ich keine Ahnung warum es nicht klappt.
    Ich denke ich übergebe die falschen Variablentypen und Zeiger.
    Wenn ich von C aus auf die DLL zugreife gibt es keine Probleme.
    Hier die Datentypen in C:

    typedef unsigned char DBL_U8; /was ist das in Delphi ?? Char oder Byte <br>
    typedef unsigned short int DBL_U16; / = word <br>
    typedef signed short int DBL_S16; / = SmallInt <br>
    typedef singed long int DBL_S32 / = Longint <br>
    typedef DBL_S32* DBL_HTABLE; / Handle für eine Tabelle <br>
    ... <br>
    Das waren die wichtigsten.<br>

    Folgende Funktionsdeklaration ist in der C-Doku:<br>

    void DBL_Field2Str(DBL_U8* Str, DBL_16 Size, DBL_HTable hTable,
    void* Rec, DBL_U8 FieldNo); <br>

    Im C-Code sieht dieser Aufruf folgendermaßen aus: <br>

    DBL_HTABLE hTable; <br>
    DBL_U8 *Rec; // ist das ein Zeiger auf ein DBL_U8 also ein PChar ?<br>
    DBL_U8 Str[11] <br>
    ...

    DBL_Field2Str(Str,12, hTable, Rec, 23);<br>

    Welche Typen sind das in Delphi (vorallem das *Rec irritiert mich)<br>
    Noch ein Beispiel:<br>

    DBL_AllocRec(DBL_HTABLE hTable, void** RecPtr); /was sollen die Sterne?<br>
    im Code:<br>

    DBL_U8 *Rec; // ist das jetzt ein Pointer oder nicht ? <br>
    ...
    DBL_AllocRec(hTable, &Rec); // was macht das &, oder ist das ein Pointer <br>

    Bitte helft mir !!!! <br>

    Danke <br>
    Florian Backes

  • #2
    Hallo Florian,

    DBL_U8 *Rec ist in Delphi ein Pointer vom Typ "DBL_U8"

    &Rec ist die Speicheradresse, auf welche Rec verweist, d.h. in Delphi wird der Funktionsparameter mit der Option var übergeben.

    Viel Erfolg Uw

    Comment


    • #3
      Ich habe das selbe Problem. Da ich C überhaupt nicht kenne hätte ich gerne gewusst welche Delphi-Typen ich für folgende C-typen setzen muß:

      LPSTR, long, unsigned char und Char Name [x];

      Danke im vorau

      Comment


      • #4
        LPSTR ist PChar, unsigned char ist Byte. Fuer char Name[x] gib mal ein laengeres sample. Das ist so nicht zu dekodieren.

        DBL_U8 *Rec; // ist das jetzt ein Pointer oder nicht ?

        Ja das ist ein Pointer. ein "Rec: PChar;" sollte funktionieren.

        DBL_AllocRec(DBL_HTABLE hTable, void** RecPtr);

        void **RecPtr besagt das dies ein Parameter vom Typ Zeiger auf Zeiger auf Irgendwas. Jeder Zeiger auf einen Zeiger ist hier kompatibel.
        Die Funktion will Speicher alloziieren und den Zeiger darauf zurueckgeben. Dazu muss man die Adresse der Zeigervariable uebergeben.
        DBL_AllocRec(hTable, &Rec);
        Genau das passiert hier. & uebergibt die Adresse der Variablen Rec die ein Zeiger ist.
        Call by reference (var) muss in C explizit gemacht werden.

        procedure DBL_AllocRec(hTable: DBL_HTABLE; var RecPtr: Pointer); stdcall;
        sollte eine korrekte Delphiumsetzung der Funktion sein.
        function DBL_AllocRec(hTable: DBL_HTABLE; var RecPtr: Pointer): Integer; stdcall;
        koennte es auch sein, da Integer der default-Rueckgabetyp ist wenn keiner angegeben ist.
        cdecl statt stdcall koennte auch moeglich sein

        Comment


        • #5
          Hallo Florian,

          besagte dll verwendet ausschließlich 'cdecl' Routinen, auch für die Eventroutinen. Um die benutzten Typen herauszufinden, kann man die zugehörige Header-Datei ansehen, hier sind die DBL_-Typen auf die C-Grundtypen heruntergebrochen

          Comment

          Working...
          X