我的文章可见:
http://www.csdn.net/author/adambear
真想不到之六:有用的技术和没用的指针
关键字:vb、safearray、数值类型指针
难度:中级
参考文章:
1、2000年7月vbpj black belt专栏文章《modify a varialbe's pointer》
作者:bill mccarthy
引言:
这真的是指针专题的最后一篇了(当然,以后肯定还会提到指针)。主要是来谈谈bill mccarthy的文章《modify a varialbe's pointer》的精华。关于这篇文章的东西,在我的《vb指针葵花宝典之safearray》里曾谈到过,但那篇文章实际上没有写出safearray的精华,用safearray最妙的地方在于可以将一个变量建在指定的内存处,就象上一篇文章给出的那个字串类一样。
正文:
bill mccarthy在那篇《modify a varialbe's pointer》里用safearray实现多进程的数组共享内存,他考虑了数组变量的类型,因此可以兼容大部分数值类型的数组,是一个非常不错的东西。我这里不讲它实现的具体方法,只是想和大家一起看看safearray还能做什么。
修改safearray结构的pvdata指针却是一个非常有用的技术,通过修改pvdata,就能够通过数组直接访问指定的内存。
和上一篇文章包装字串指针类一样,通过修改pvdata,我们也可以包装一些普通数值类型变量的指针类。
我在指针的第一篇文章里说过,要想实现c语言里'*'这个取指针所指变量值功能,必须要用copymemory。实际上,我说错了,我们完全可以实现和c里一样的指针,如下:
//c语言
long l;
long* pl = &l;
*pl = 12;
printf("l = %d *pl = %d", l, *pl);
'vb里
dim pl as new plong, l as long
pl.attach l
'也可以 pl.ptr = varptr(l)
pl = 12
debug.print "l ="; l; " *pl ="; pl
结果都能够通过修改pl指针,达到修改变量l的目的。
上面vb代码里的plong就是一个包装好的long型变量的指针类,下面看看如何来实现它:
option explicit
'********************************************************
'plong.cls
'包装一个long型指针的类
'作者: 熊超 id: adambear 2002年3月18日
'http://www.csdn.net/author/adambear
' 你可以自由使用本类模块,不过请保留本声明
'********************************************************
private declare sub copymemory lib "kernel32" alias "rtlmovememory" (destination as any, source as any, byval length as long)
private m_arr(0) as long
'缺省属性
public property get data() as long
data = m_arr(0)
end property
public property let data(byval value as long)
m_arr(0) = value
end property
public sub attach(target as long)
ptr = varptr(target)
end sub
public property let ptr(byval target as long)
dim psa as long
'得到safearray结构指针psa
copymemory psa, byval varptrarray(m_arr), 4
'这个指针偏移12个字节后就是pvdata指针
copymemory byval (psa + 12), target, 4
end property
public property get ptr() as long
ptr = m_sa.pvdata
end property
private sub class_terminate()
copymemory byval varptrarray(m_arr), 0&, 4
end sub
要将它改成byte的指针类,只需要将上面的代码中m_arr数组的类型,data属性和attach方法中的参数类型改为byte型即可。
当我们这样做出plong、pbyte、pinteger后,我们就能够玩点和c里一样的花样了。
sub main()
dim pb as new pbyte, b as byte
dim pi as new pinteger, i as integer
dim pl as new plong, l as long
'用attach方法将经过类型检查,直接用ptr属性则可以绕过类型检查
pb.attach b
pi.attach i
pl.attach l
'试试指针
b = 1
debug.print "b ="; b; " *pb ="; pb