前言:我们都知道,在VB中,可以使用VarPtr、StrPtr和ObjPtr来获得变量的地址,它们之间有什么区别和联系呢?许多资深的VB人员告诉我们,最好将API函数声明中ByVal lpstr As String改为ByVal lpStr As Long,这又是为什么呢?如何正确地利用这些函数向API传递指针呢? 首先,我们来了解一下VB中的变量及其定义。 也许你会说我多此一举,如此简单的问题,还需要我来解释吗? 其实不然。 现在假设有以下语句: Dim i As Long 它表示什么呢?它表示我们定义了一个名称为a且类型为Long的变量。然而对于内存来说,即没有名称,也没有类型,只有用数字数字表示的地址和连续所占用地址的数量。由于Long为4个Byte大小,因此,我们可以把这条语句看作程序对系统的内存管理器说,俺想在地址a上使用大小为4Byte这一段连续地址,然后准备在这段地址里放点东西,当然,俺的东西不会超过4Byte的。 再看一下这条语句: Dim s As String 它又表示什么呢?直白地说,它表示我们定义了一个名称为s且类型为String的变量。现在麻烦的是,String的大小是不确定的。如果程序还像上一条语句一样直接告诉系统的内存管理器说:喂,俺想在地址s上放点东西。内存管理器听到后说:又来放东西啊,多大啊?程序说:不知道。内存管理器说:不知道你来干啥啊,我乍给你准备啊?简直是胡闹,一边去,其他人正等呢。这下程序犯了愁,问题不解决,没法给设计人员交代啊。想了想,又回去跟内存管理器说:这样吧,我在地址s上做一个标志吧,只有4Byte大小(32位操作系统的最大寻址能力),到时东西带来了,再将这个标志改为东西实际存放的地址,好吗?内存管理器说:这就对啦,别忘了把东西带来啊。 通过上述两条语句,我们可以了解到,变量定义实际上表示两个含义,一个是变量名称,一个是变量的值,它们都会占用空间的,只不过有些变量由于个子比较小,所以变量名称和变量值放在一块就行,如变量i,而有些变量由于块头比较大或不确定,需要分别进行存放,如变量s。 现在,我们站在内存管理器的角度来理解一下,假设变量a的地址为&H0013FBD0,a的值为100,那么很显然,从地址&H0013FBD0开始到&H0013FBD3这4个byte的空间里,存放的是100;而假设变量s的地址为&H0013FC50,s的值为“100”,那么,从地址&H0013FC50到&H0013FC53这4个Byte的空间里,存放的是指向实际存放“100”的值的地址。