【发布时间】:2018-02-16 11:31:11
【问题描述】:
我收到此错误,但不知道如何解决。这是我的代码(下面有更多详细信息):
CP1626.h
#pragma once
#include <Windows.h>
namespace CP1626{
...
//DLL functions
void setCallbackDataWriteFunc(PNIO_CBF_DATA_WRITE _ptrDataWriteFunc);
...
}
cp1626.cpp
#include "cp1626lib.h"
...
typedef void (* ptr_setCallbackDataWriteFunc)(PNIO_CBF_DATA_WRITE);
ptr_setCallbackDataWriteFunc setCallbackDataWriteFuncFunction;
...
void CP1626::setCallbackDataWriteFunc(PNIO_CBF_DATA_WRITE _ptrDataWriteFunc){
(setCallbackDataWriteFuncFunction)(_ptrDataWriteFunc);
}
而PNIO_IOXS 定义为
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 */
然后,我使用 C++/CLI 和 .NET(我的主要用户界面类)进行编码,接下来由谁来做:
UI_Main.h
#include "cp1626lib.h"
...
public ref class UI_Main : public System::Windows::Forms::Form{
//Local function definition, which is assigned to callback
PNIO_IOXS dataWriteFunc(PNIO_UINT32 DevHndl, PNIO_DEV_ADDR * pAddr, PNIO_UINT32 BufLen, PNIO_UINT8 * pBuffer, PNIO_IOXS Iocs);
...
void InitCP1626(){
...
CP1626::setCallbackDataWriteFunc(dataWriteFunc);
...
}
}
错误位于CP1626::setCallbackDataWriteFunc(dataWriteFunc); 行,它表示指向成员的指针对于托管类无效。当我在托管课程中时,执行此回调分配的正确形式是什么?我认为我应该找到一种将委托转换为函数指针的方法,但我也不确定。
提前谢谢你。
编辑:我尝试将CP1626::setCallbackDataWriteFunc(dataWriteFunc); 更改为CP1626::setCallbackDataWriteFunc(Marshal::GetFunctionPointerForDelegate(del));,将dataWriteFunc^ del; 更改为格式为delegate PNIO_IOXS dataWriteFunc(PNIO_UINT32 DevHndl, PNIO_DEV_ADDR * pAddr, PNIO_UINT32 BufLen, PNIO_UINT8 * pBuffer, PNIO_IOXS Iocs); 的委托
但它也失败了。这时候报错说'CP1626::setCallbackDataWriteFunc : cannot convert parameter 1 from 'System::IntPtr' to 'PNIO_CBF_DATA_WRITE''
【问题讨论】:
标签: c++ c++-cli function-pointers