还是VB.NET和C之间的内存地址出错的问题,有请各位神仙

yinweihong 2006-05-10 12:36:03
short _stdcall A(void *src, ulint srclen, void *dst, ulint *dstlen)
{
char addr[256];

memset( addr, "\0", sizeof(addr));
sprintf( addr, "Src:%ld, Len:%d, Dst:%ld, dstLen:%ld\n", src, srclen, dst, dstlen);
MessageBox( NULL, addr, "", MB_OK);
.....
}
前2个参数IN,后2个OUT
VB中声明:
Declare Function A Lib "*.dll" (ByVal srcStr As IntPtr, ByVal srcLength As Long, ByVal dstStr As IntPtr, ByVal dstLength As IntPtr) As Short


Dim bufAddr As IntPtr = Marshal.AllocHGlobal(deLength)'delength长度,可以计算出来
Marshal.Copy(debuf, 0, bufAddr, deLength)'debuf是个数组,有值的

Dim dtPtr As IntPtr = Marshal.AllocHGlobal(filesize)
Marshal.Copy(debuf, 0, dtPtr, deLength)
Dim getl As IntPtr = Marshal.AllocHGlobal(4)

A(bufAddr, deLength, dtPtr, getl)调进去后,,,bufaddr的内存地址在DLLMESSAGEBOX中弹出来显示正确,,delength长度也是对的,第三个dtPtr的地址在DLL弹出的MSG框中中显示是0,而msg框中显示第四个的地址却刚好是dtPtr的..........,

怎么解决,请教各位神仙,,,急,请帮忙解决
...全文
250 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
因为dtPtr的内存地址没传进去,所以OUT的数据没地方写,VB.NET里面就产生了异常,
object reference not set to an instance of an object
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
C的DLL,不能改,只能动VB.NET里面的代码,,,,实在是想不通了,
yinweihong 2006-05-10
  • 打赏
  • 举报
回复


赫赫,马上揭贴,好象有点MEM LEAK,,,昏...
laviewpbt 2006-05-10
  • 打赏
  • 举报
回复
还不揭贴,我要分啊,在多点就可以生三颗角了。
Ninputer 2006-05-10
  • 打赏
  • 举报
回复
汗一个。。
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
不要叫我老大,我才2个角的说,,,,,装配大哥才是真正的老大!!!赞,赫赫
laviewpbt 2006-05-10
  • 打赏
  • 举报
回复
恭喜尹老大!
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
发现自己做事总是毛手毛脚的,,,哎,都马上P3的人了,这怎么行呢...
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
多谢多谢,已经OK了
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
我靠,对谢提醒,找了找那句话,我竟然上五调试的时候把他给注释掉了,真是晕,我说怎么老返回0是怎么回事....
Ninputer 2006-05-10
  • 打赏
  • 举报
回复
就是问你A是怎么写的
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
UInt32 还是返回的0
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
C那边? dstlen应该是一个OUT的,怎么会这么写呢

有个SAMPLE写道:

uchr dstlha[102400], chklha[102400];
ulint dst_len,

ret = A(dstlha, dst_len, chklha, &chk_len);
for(i=0; i<dst_len; i++){
printf("%x ", dstlha[i]);
}
Ninputer 2006-05-10
  • 打赏
  • 举报
回复
你C那边是怎么写的?

*dstlen = 100;

是这样的吗?
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
赫赫,不好意思,我也是做测试...
估计不是溢出问题,我放了一个INT32放那,传的BYREF,地址是传过去了,但是返回值却是0....
Ninputer 2006-05-10
  • 打赏
  • 举报
回复
你的变量名字真让人头晕。。
ByVal dstLength As IntPtr 这个参数改成 ByRef dstLength As UInteger 吧
如果不是VB2005你就还用Integer,我估计Length这类东东应该不会大到整数溢出吧。。
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
装配兄,...赫赫,这下取数据回来不好取了,marshal.readint32()读到的是一个好大的负数,,

而实际上应该是从dstStr去取的内存的长度,,,......如何解决...
mingxuan3000 2006-05-10
  • 打赏
  • 举报
回复
楼上的来晚了呀,
接分
Ninputer 2006-05-10
  • 打赏
  • 举报
回复
一眼就能看出Long用错了
yinweihong 2006-05-10
  • 打赏
  • 举报
回复
4*8=32的,应该是这样子解释的说,,,哎

还有要注意,BYREF ... INTPTR就是传的指针的指针了

就这2个问题
加载更多回复(7)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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