错误:"指向成员的指针对托管类无效"
ERROR: 'a pointer to member is not valid for a managed class'
我会遇到此错误,我不知道如何解决。这是我的代码(以下更多详细信息(:
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(Marshal::GetFunctionPointerForDelegate(del));
更改LINE CP1626::setCallbackDataWriteFunc(dataWriteFunc);
,并使用dataWriteFunc^ del;
a的委托使用格式delegate PNIO_IOXS dataWriteFunc(PNIO_UINT32 DevHndl, PNIO_DEV_ADDR * pAddr, PNIO_UINT32 BufLen, PNIO_UINT8 * pBuffer, PNIO_IOXS Iocs);
但也失败了。此时,错误说'cp1626 :: setCallbackDatawriteFunc:无法将参数1从'System :: intptr'转换为'pnio_cbf_data_write''
您可能会考虑从Microsoft重新阅读文档的一部分。即使它是旧的(例如从2006年开始(也没有过时。
示例。Microsoft记录了回调的使用。https://msdn.microsoft.com/en-us/library/367eeye0.aspx
在您的情况下,您没有看,getFunctionPointerfordelegate((正在返回。这是一个intptr。这是Microsoft用来将各种指针包装成.NET的一个结构的结构。它具有方法void* ToPointer()
PNIO_CBF_DATA_WRITE cb = static_cast<PNIO_CBF_DATA_WRITE>(IntPtr.ToPointer());
CP1626::setCallbackDataWriteFunc(cb);
请注意,您应该使用__ -stdcall进行回调。提到需要兼容。
typedef PNIO_IOXS (__stdcall *PNIO_CBF_DATA_WRITE)
如果您无法重新编译使用__StdCall的源,请在已定义的另一个函数上重新路由。
我试图在测试项目中使用您的代码,但我不想设置独立的地方调用回调。
善意
P.S。我想以低质量标记您的问题。因为有文档可以阅读/Google并从中学习。您应该花点时间,非常友善地标记您最近的四个问题的一些答案,这是正确的答案。
- 如何实现容纳整数和无效指针的双向链表?
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- 应用地址清理器后,免费无效指针消失
- C++ 在具有数组成员的类上无效指针/双精度释放
- 不断得到分段错误和free()无效指针
- 使用无效指针初始化指针声明符的行为是否未定义?
- 结构作为参数的函数产生错误:free():无效指针:0x00007efd47b
- 无效指针、隔离标识符等
- c++ 无效指针从空闲列表中取消排队
- C++ munmap_chunk(): 无效指针:
- 为什么我的简单C++程序使用队列和 fstream 错误到无效指针
- 无效指针和非初始化的指针之间的差异
- 如何用无效指针初始化unique_ptr的向量
- 地址清理器在静态强制转换无效指针时报告错误
- MS4:Free(Free()无效指针0xB74E74E0 ***
- ***检测到的GLIBC *** MS2:free():无效指针:0xB7526FF4 ***
- 无效指针功能的输出
- 有人能告诉我这是如何在main()中实现的吗?(关于无效指针的问题)
- C++11使用智能指针,但得到无效指针
- 无效指针的相关性