真想不到之六:有用的技术和没用的指针[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 adambear 的 blog

我的文章可见:
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
       

本文关键:VB、SafeArray、数值类型指针
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top