本文地址:
http://blog.csdn.net/useway《Java程序员,上班那点事儿》
——作者:钟声
卷首语:
无数次的见到有人一谈到VB都会显露出不屑的神情。
然而,当很多人享受这VB带来的便捷的同时,还在嘲讽这个VB,总是用VC的种种所谓的优势来和VB对比。让我想起了今天的Java,当那些享受着Java带来的轻松的人,却还在用C/C++嘲讽着Java是一样的。
VB它的优势岂能由VC企及,不说别的,只说VB的开发速度VC基本上是望尘莫及的。传统上,VC相对与VB而言有很多的优势:
1、指针:这个似乎是打击所有没有指针的语言(如:java)的利器。
3、系统消息钩子:用钩子程序获取Windows系统消息。
5、和硬件相关的开发,如显示器、声卡、网卡等。
本系列连载,将针对上述5个问题来讨论,VB实现的可能性。
一、为什么VB要用指针:
C/C++中都可以操作指针,用指针可以很方便的访问到内存区域,C++中的指针其实就是数组的一个访问方式而已,由于其使用比较方便,可以非常方便的进行对内存区域的赋值与读取操作,因此,用惯了C++的程序员乐此不疲。
其实,我们在用VB开发一般程序的时候是没有必要用指针去访问内存某区域的。因为VB为我们提供了一个非常方便的访问方法——就是VB的数组。用数组可以很方便的使用一组数据。然而,为什么,在VB中我们非要去实现指针的操作呢?
1、数据操作速度的需求
二、VB怎么用指针
要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来。
A、在讲解这两个问题之前,我们需要了解几个问题:
1、VB的数组与C++的数组的区别
有可能,大家现在认为VB的数组和C++的数组没有任何区别,都是内存中的一段地址而已,其实不然。
C++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已。
Private TypeVB数组
数组维数
数组大小
真实的数组
End Type
真实的数组
End Type
Public Declare Sub copyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length As Long)
函数原型
第一个参数:目的地址指针
第二个参数:源地址指针
第三个参数:复制的大小
请注意,在copyMemory的VB声明中,传递的源与目的是Any类型,也就是说可以是任何类型的变量。
B、如何用指针
1、如何取得数组的指针
请看如下程序:
pOutputArray As Long
outputArray() As Byte
outputArray() As Byte
ReDim outputArray(100) As Byte
pOutputArray = VarPtr(outputArray(0))
pOutputArray = VarPtr(outputArray(0))
说明:
2、如何将指针所指向的数组取出来
请看如下程序:
copyMemory ByVal pOutputArray,ByVal pData,UBound(outputArray)
说明:
pData是一个内存块的指针,通过这句话的执行,我们得到了pData指向的内存区域中的数据到pOutputArray数组中。
三、高级应用:取得函数的指针
Public Sub RegisterWinProc(ByVal hwnd As Long)
'传入hWnd是本窗口的句柄
'getwindowlong从指定窗口的结构中取得信息
prevWndProc = getwindowlong(hwnd,GWL_WNDPROC)
'SetwindowLong在窗口结构中为指定的窗口设置信息
SetwindowLong hwnd,GWL_WNDPROC,AddressOf WndProc
DesthWnd = hwnd
End Sub
'getwindowlong从指定窗口的结构中取得信息
prevWndProc = getwindowlong(hwnd,GWL_WNDPROC)
'SetwindowLong在窗口结构中为指定的窗口设置信息
SetwindowLong hwnd,GWL_WNDPROC,AddressOf WndProc
DesthWnd = hwnd
End Sub
四、结束语
钟声
2009-7-6
原文链接: http://www.jb51.cc/article/p-tonywgia-qm.html