回调分配期间'无法转换...'错误(从C迁移的代码)

时间:2018-02-06 16:26:13

标签: c callback c++-cli

我正在将一些用C编码的行迁移到C ++ / CLI(基于.NET的UI Windows窗体)。当我尝试进行这种分配时,我遇到了一个问题:

myCallbacks.cbf_data_write = this->dataWriteFunc;

在这种情况下,dataWriteFunc定义为:

PNIO_IOXS dataWriteFunc(PNIO_UINT32, PNIO_DEV_ADDR *, PNIO_UINT32, PNIO_UINT8 *, PNIO_IOXS);

myCallbacks声明为

PNIOD_CBF_FUNCTIONS myCallbacks;

typedef struct {
    PNIO_UINT32                      size;                      /* size of struct = sizeof(PNIO_CBF_FUNCTIONS) */
    PNIO_CBF_DATA_WRITE              cbf_data_write;            /* mandatory */
    PNIO_CBF_DATA_READ               cbf_data_read;             /* mandatory */
    PNIOD_CBF_ASYNC_REC_READ         cbf_async_rec_read;        /* mandatory */
    PNIOD_CBF_ASYNC_REC_WRITE        cbf_async_rec_write;       /* mandatory */
    PNIOD_CBF_SYNC_ALARM_DONE        cbf_sync_alarm_done;       /* mandatory */
    PNIOD_CBF_ASYNC_CONNECT_IND      cbf_async_connect_ind;     /* mandatory */
    PNIOD_CBF_ASYNC_OWNERSHIP_IND    cbf_async_ownership_ind;   /* mandatory */
    PNIOD_CBF_ASYNC_INDATA_IND       cbf_async_indata_ind;      /* mandatory */
    PNIOD_CBF_SYNC_DISCONNECT_IND    cbf_sync_disconnect_ind;   /* mandatory */
    PNIOD_CBF_SYNC_DATA_STATUS_IND   cbf_sync_data_status_ind;  /* mandatory */
    PNIOD_CBF_ASYNC_PRM_END_IND      cbf_async_prm_end_ind;     /* mandatory */
    PNIOD_CBF_SYNC_STOPPED           cbf_sync_device_stopped;   /* mandatory */
    PNIOD_CBF_ASYNC_IRT_INIT_INPUTS  cbf_async_irt_init_inputs; /* mandatory for IRT top */
    PNIOD_CBF_SYNC_CP_STOP_REQ       cbf_sync_cp_stop_req;      /* optional */
    PNIOD_CBF_SYNC_START_LED_FLASH   cbf_sync_start_led_flash;  /* optional */
    PNIOD_CBF_SYNC_STOP_LED_FLASH    cbf_sync_stop_led_flash;   /* optional */
    PNIOD_CBF_RESERVED
} ATTR_PACKED PNIOD_CBF_FUNCTIONS;

此外:

typedef PNIO_IOXS    (*PNIO_CBF_DATA_WRITE) /* write data to IO stack (local ==> remote) */
       (PNIO_UINT32          DevHndl,       /* Handle for Multidevice */
        PNIO_DEV_ADDR      * pAddr,         /* geographical address */
        PNIO_UINT32          BufLen,        /* length of the submodule input data */
        PNIO_UINT8         * pBuffer,       /* Ptr to data buffer to write to */
        PNIO_IOXS            Iocs);         /* remote (io controller) consumer status */

那么,究竟我做错了什么? VS2012给了我下一个错误:

Error   4   error C2440: '=' : cannot convert from 'PNIO_IOXS (__thiscall CP1626::* )(PNIO_UINT32,PNIO_DEV_ADDR *,PNIO_UINT32,PNIO_UINT8 *,PNIO_IOXS)' to 'PNIO_CBF_DATA_WRITE' c:\users\hp\documents\visual studio 2012\projects\ui_cp1626\ui_cp1626\Profinet_IDevice.h    513 1   UI_CP1626

在这种情况下,关联回调的正确形式是什么?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您正在尝试将此调用函数(非静态类成员函数)转换为普通函数。问题是非静态类成员采用额外的隐式参数,指向类对象的指针又名this,因此dataWriteFunc的隐式签名是:

PNIO_IOXS dataWriteFunc(CP1626 *this, PNIO_UINT32, PNIO_DEV_ADDR *,
                        PNIO_UINT32, PNIO_UINT8 *, PNIO_IOXS);

,注意第一个参数,它的隐含存在是赋予函数“__thiscall”属性的东西。如果将此函数声明为

static PNIO_IOXS dataWriteFunc(PNIO_UINT32, PNIO_DEV_ADDR *,
                               PNIO_UINT32, PNIO_UINT8 *, PNIO_IOXS);

那么错误就会消失。请注意,静态方法this内部不可用。