工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VB > 正文
真没想到VB也可以这样用之指针技术
[文章信息]
作者:adambear
时间:2005-02-17
出处:BLOG
责任编辑:方舟
[文章导读]
若想成为VB里的东方不败,熟习VB《葵花宝典》,掌握VB指针技术,乃是不二的法门
advertisement
热点推荐
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
· 在VB6中用命令行为模式控制GUI动作
[正文]

上一页  1 2 3 4 5  下一页

  4、AddressOf

  它用来得到一个指向VB函数入口地址的指针,不过这个指针只能传递给API使用,以使得API能回调VB函数。

  本文不准备详细讨论函数指针,关于它的使用请参考VB文档。

  5、拿来主义

  实际上,有了CopyMemory,VarPtr,AddressOf这三把斧头,我们已经可以将C里基本的指针操作拿过来了。

  如下面的C程序包括了大部分基本的指针指针操作:

struct POINT{
 int x; int y;
};

int Compare(void* elem1, void* elem2){}

void PtrDemo(){
 //指针声明:
 char c = 'X'; //声明一个char型变量
 char* pc; long* pl; //声明普通指针
 POINT* pPt; //声明结构指针
 void* pv; //声明无类型指针
 int (*pfnCastToInt)(void *, void*);//声明函数指针:
 //指针赋值:
 pc = &c; //将变量c的地址值赋给指针pc
 pfnCompare = Compare; //函数指针赋值。
 //指针取值:
 c = *pc; //将指针pc所指处的内存值赋给变量c
 //用指针赋值:
 *pc = 'Y' //将'Y'赋给指针pc所指内存变量里。
 //指针移动:
 pc++; pl--;
}

  这些对指针操作在VB里都有等同的东西,前面讨论ByVal和ByRef时曾说过传指针和传地址是一回事,实际上当我们在VB里用缺省的ByRef声明函数参数时,我们已经就声明了指针。

  如一个C声明的函数:long Func(char* pc)

  其对应的VB声明是:Function Func(pc As Byte) As Long

  这时参数pc使用缺省的ByRef传地址方式来传递,这和C里用指针来传递参数是一样。

  那么怎么才能象C里那样明确地声明一个指针呢?

  很简单,如前所说,用一个32位长整数来表达指针就行。在VB里就是用Long型来明确地声明指针,我们不用区分是普通指针、无类型指针还是函数指针,通通都可用Long来声明。而给一个指针赋值,就是赋给它用VarPar得到的另一个变量的地址。具体见程序五。

  【程序五】:同C一样,各种指针。

Type POINT
 X As Integer
 Y As Integer
End Type

Public Function Compare(elem1 As Long, elem2 As Long) As Long
'
End Function

Function FnPtrToLong(ByVal lngFnPtr As Long) As Long
 FnPtrToLong = lngFnPtr
End Function

Sub PtrDemo()
 Dim l As Long, c As Byte, ca() As Byte, Pt As POINT
 Dim pl As Long, pc As Long, pv As Long, pPt As Long, pfnCompare As Long
 c = AscB("X")
 pl = VarPtr(l) '对应C里的long、int型指针
 pc = VarPtr(c) '对应char、short型指针
 pPt = VarPtr(Pt) '结构指针
 pv = VarPtr(ca(0)) '字节数组指针,可对应任何类型,也就是void*
 pfnCompare = FnPtrToLong(AddressOf Compare) '函数指针
 CopyMemory c, ByVal pc, LenB(c) '用指针取值
 CopyMemory ByVal pc, AscB("Y"), LenB(c) '用指针赋值
 pc = pc + LenB(c) : pl = pl - LenB(l) '指针移动
End Sub


  我们看到,由于VB不直接支持指针操作,在VB里用指针取值和用指针赋值都必须用CopyMemory这个API,而调用API的代价是比较高的,这就决定了我们在VB里使用指针不能象在C里那样自由和频繁,我们必须要考虑指针操作的代价,在后面的"指针应用"我们会再变谈这个问题。

  程序五中关于函数指针的问题请参考VB文档,无类型指针void*会在下面"关于Any的问题"里说。

  程序五基本上已经包括了我们能在VB里进行的所有指针操作,仅此而已。

  下面有一个小测试题,如果现在你就弄懂了上面程咬金的三板斧,你就应该能做得出来。

  上面提到过,VB.NET中没有VarPtr,我们可以用声明API的方式来引入MSVBVM60.DLL中的VarPtr。现在的问题如果不用VB的运行时DLL文件,你能不能自己实现一个ObjPtr。答案在下一节后给出。


上一页  1 2 3 4 5  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 在VB6中用命令行为模式控制GUI动作
  • VB设计Win2000下截获IP数据包程序
  • 真没想到VB也可以这样用之VB能做什么
  • 用VB编写异步多线程下载程序
  • 适合Visual Basic初学者的10个小技巧
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement