Einzelnen Beitrag anzeigen

Beowulf01

Registriert seit: 13. Jan 2011
11 Beiträge
 
Delphi 7 Professional
 
#4

AW: C DLL mit Delphi verwenden

  Alt 22. Feb 2011, 09:10
C Beispiel:

Header-File
Code:

#undef ATTR_PACKED
#if defined(_MSC_VER)
 #pragma pack( push, safe_old_packing, 4 )
 #define ATTR_PACKED
...
#endif

#ifdef PASCAL
    #define CODE_ATTR __stdcall
#else
    #define CODE_ATTR
#endif

typedef IOXS   (*CBF_DATA_WRITE) /* write data to IO stack (local ==> remote) */
       (UINT32          DevHndl,      /* Handle for device */
        DEV_ADDR     * pAddr,        /* address */
        UINT32          BufLen,       /* length of input data */
        UINT8         * pBuffer,      /* Ptr to data buffer to write to */
        IOXS           Iocs);        /* remote status */

typedef IOXS   (*CBF_DATA_READ) /* read data from IO stack (remote ==> local) */
       (UINT32          DevHndl,      /* Handle for device */
        DEV_ADDR     * pAddr,        /* address */
        UINT32          BufLen,       /* length of input data */
        UINT8         * pBuffer,      /* Ptr to data buffer to read from */
        IOXS           Iops);        /* provider status */

/* structure for callback function block */
typedef struct {
    UINT32               size;         // size of struct = sizeof(CBF_FUNCTIONS)
    CBF_DATA_WRITE      cbf_data_write;
    CBF_DATA_READ       cbf_data_read;
} ATTR_PACKED CBF_FUNCTIONS;

UINT32 CODE_ATTR device_open (
        UINT16          DeviceId,      /* [in] device id */
        CBF_FUNCTIONS * pCbf,          /* [in] cbf */
        UINT32        * pDevHndl);     /* [out] device handle */
Hätte ich vorher schon genauer hingeschaut, hätte ich gesehen, dass es stdcall ist...(s.o.)

Und hier meine Umsetzung in Delphi:

Code:

{$Z4}

TCbfDataRWProc =
  procedure(
    DevHndl    : UINT32;
    pAddr      : PTDevAddr;
    BufLen     : UINT32;
    pBuffer    : PTUINT8;
    Ioxs       : EIoXS
  ); EIoXS; stdcall;

TCbfFunctions =
  packed record
    size               : UINT32;
    cbf_data_write     : TCbfDataRWProc;
    cbf_data_read      : TCbfDataRWProc;
  end;

PTCbfFunctions = ^TCbfFunctions;

function device_open(
  DeviceId       : UINT16;
  pCbf           : PTCbfFunctions;
  pDevHndl       : PTUINT32
  ): UINT32; stdcall;
  Mit Zitat antworten Zitat