导航
  • 主页
  • VBS
  • .NET技术
  • VBA
  • VB网络编程
  • VB多媒体
  • VB数据库
  • VB控件
  • VB COM/DCOM
  • VB基础类
  • VB API
  • 问答

还是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的..........,

怎么解决,请教各位神仙,,,急,请帮忙解决
...全文
213 点赞 收藏 27
写回复
27 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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,,,昏...
回复
33184777 2006-05-10
还不揭贴,我要分啊,在多点就可以生三颗角了。
回复
Ninputer 2006-05-10
汗一个。。
回复
yinweihong 2006-05-10
不要叫我老大,我才2个角的说,,,,,装配大哥才是真正的老大!!!赞,赫赫
回复
33184777 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个问题
回复
发动态
发帖子
VB
创建于2007-09-28

1.5w+

社区成员

VB技术相关讨论,主要为经典vb,即VB6.0
申请成为版主
社区公告
暂无公告