急急急!!C#调用C++的回调函数时,出现“0x0000”指令引用的"0x00000“内存。该内存不能为"read"

qqvbn 2012-05-10 01:04:59
C++:
typedef void(WINAPI *CallbackServerFind)(
DVS_MACHINE_TYPE nDeviceType,
char *pDeviceName,
char *pIP,
BYTE macAddr[6],
WORD wPortWeb,
WORD wPortListen,
char *pSubMask,
char *pGateway,
char *pMultiAddr,
char *pDnsAddr,
WORD wMultiPort,
int nChannelNum,
int nFindCount)
C#:[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackServerFind(DVS_MACHINE_TYPE nDeviceType, string pDeviceName, string pIP,[MarshalAs(UnmanagedType.LPArray,SizeConst=6)] byte[] macAddr, short wPortWeb,
short wPortListen, string pSubMask, string pGateway, string pMultiAddr, string pDnsAddr, short wMultiPort, int nChannelNum,
int nFindCount);
为什么最后调用成功了,但是出现 “0x0000”指令引用的"0x00000“内存。该内存不能为"read" 错误。

那位高手可以帮忙解决一下。
...全文
697 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqvbn 2012-05-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
首先[UnmanagedFunctionPointer(CallingConvention.Cdecl)]这句应该去掉,因为WINAPI是StdCall的
如果你说的调用是指:C++方定义函数体,C#方获得函数指针后调用的话,实参应该是要自行处理的(无法依赖MarshalAs),即Byte数组要固定或复制到非托管内存,再传入首地址,string要转化为Ansi并复制到非托管内存...
[/Quote]

去掉它好像没事了。谢谢了!有问题再问你。
WAN 2012-05-12
  • 打赏
  • 举报
回复
char *或其它指针都在C#中定义为IntPtr
WAN 2012-05-12
  • 打赏
  • 举报
回复
C++中的BYTE macAddr[6]形参,代表的就是一个指针,C#中可以定义为IntPtr
WAN 2012-05-12
  • 打赏
  • 举报
回复
首先[UnmanagedFunctionPointer(CallingConvention.Cdecl)]这句应该去掉,因为WINAPI是StdCall的
如果你说的调用是指:C++方定义函数体,C#方获得函数指针后调用的话,实参应该是要自行处理的(无法依赖MarshalAs),即Byte数组要固定或复制到非托管内存,再传入首地址,string要转化为Ansi并复制到非托管内存...
sdl2005lyx 2012-05-11
  • 打赏
  • 举报
回复
楼主把解决的经验,贴出来给大家分享分享。。。。
魚躍龍門 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 1 楼 的回复:
C++里面的代码有吗,有的话贴出来。
应该是C++代码里缺少必要的判断。
你传的参数如果是指针的不要为空。


没有C++里面的代码,这是回调函数,不需要传入数据。最后我觉得是回调函数中的第四个参数定义的问题。

C++中是定长BYTE[],在C#中应该是什么类型呢?
[/Quote]


C# 中也有byte[] 类型啊...
qqvbn 2012-05-11
  • 打赏
  • 举报
回复
各位高手,大家帮帮忙,我再弄不出来。就彻底的完蛋了。。
a547428081 2012-05-11
  • 打赏
  • 举报
回复
不知,弄出来分享一下吧
qqvbn 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
C++里面的代码有吗,有的话贴出来。
应该是C++代码里缺少必要的判断。
你传的参数如果是指针的不要为空。
[/Quote]

没有C++里面的代码,这是回调函数,不需要传入数据。最后我觉得是回调函数中的第四个参数定义的问题。

C++中是定长BYTE[],在C#中应该是什么类型呢?
qqvbn 2012-05-11
  • 打赏
  • 举报
回复
那个又出问题了。还是上面的问题。怎么回事呢?
qqvbn 2012-05-10
  • 打赏
  • 举报
回复
终于解决了。庆祝一下
满衣兄 2012-05-10
  • 打赏
  • 举报
回复
C++里面的代码有吗,有的话贴出来。
应该是C++代码里缺少必要的判断。
你传的参数如果是指针的不要为空。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧