VB指针
——作者:钟声
卷首语:
无数次的见到有人一谈到VB都会显露出不屑的神情。
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++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已。
而VB数组其实是一个结构体,在这个结构体中包含了关于这个数组的描述信息,其结构类似如下:
Private TypeVB数组
数组维数
数组大小
真实的数组
End Type
真实的数组
End Type
2、Copymemory系统函数
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any,Source As Any,ByVal Length As Long)
函数原型
VOID CopyMemory(
PVOID Destination,
CONST VOID *Source,
DWORD Length
);
PVOID Destination,
CONST VOID *Source,
DWORD Length
);
第一个参数:目的地址指针
第二个参数:源地址指针
第三个参数:复制的大小
请注意,在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))
说明:
我们声明了一个Byte数组outputArray,用VarPtr函数,取出数组的指针赋给了Long型变量pOutputArray。
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
四、结束语
大家看,VB在处理指针的时候,只要掌握了相应的方法,是不是VC在这时候也就黯然失色了呢?
钟声
2009-7-6
原文链接:https://www.f2er.com/vb/262623.html