神奇的*号
在使用VB编程的过程中,我想没有人不会用到定义一个字符串变量的,当然要抬扛就没折了。而在VB中定义一个字符串有如下两种方法:
1、dim s as string
2、dim s as string *100
其中第一种方法我想是用的最多了,在这里不说,因为文章的标题的“神奇的*号”,所以,我要说是第二种声明方法。第二种方法我想做VB程序的也没有不知道这是什么意思的,就是声明一个长度为100的字符串。这里的*就是表明声明一个定长的字符串。
在大多VB书籍中,讲到这里只是说明加了*号表明是一个定长字符串,不加表明是变长的,就不再说其它的了,最多有的书再讲一点,说变长字符串最多可包含大约21亿(2的31次方)个字符,定长字符串可包含1到大约64K(2的16次方)个字符,这是我看到讲的最深的书了。在一般的使用过程中,这两种方法也没什么差别,只要长度够用,两种均可。但我要说的是在这里,这个*有时很神奇!因为用第二种声明方法声明的字符串,在当做参数用时就体现出了它的神奇。在应用时,有时需要按引用ByRef(在C/C++中是指针),此时如果还按第一种声明方法有时出现灾难性的内存错误!而改用第二种方法,就可以风平浪静,一切正常!
说到这里我想已经可以看出*之神奇所在了,那就是可以当做指针用。当然,在VB里是没有指针这个概念的,顶多是引用了(不要说还有取地址的StrPtr,ObjPtr函数呀,又抬扛了不是?)。所以在VB和VC进行混合开发时经常会遇到这样的问题,因为与VC打交道就免不了使用指针,做过VC的一定知道其中有不少LPTSTR,LPSTR等诸如此类的声明。要在VB中对应这类声明,最好用第二种方法,这样可省去很多麻烦。
下面举个简单又常用的例子。在VB程序中读取INI文件中的字符串。当然Windows API有现成的函数:GetPrivateProfileString,而用Visual Studio中的API View取过来的声明是这样的:
Private(Public) Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
好了,现在一INI文件定义如下:
[Test]
Str=pursuer
则要读取Str的内容,这一段程序就可以轻松搞定!代码如下
Dim lpString as String *10
GetPrivateProfileString "Test", "Str1", "", lpString, 10, "c:\t.ini"
MsgBox lpString
这时如果这样:
Dim lpString as String *
GetPrivateProfileString "Test", "Str1", "", lpString, 10, "c:\t.ini"
MsgBox lpString
结果……哈哈,你自己试试看吧!
这时盖茨的操作系统会说你的程序很粗鲁,并以很粗鲁的方式告诉你,程序出错了!哈哈…..
这只是个简单的例子,如果用VB和VC混合开发,如VC做DLL文件在VB中调用,这样可以解决很多问题并且很方便。例如现有一VC做的DLL(Handle.dll) 文件,其中有一函数其原型是这样的:
DWORD GetUserName(LPTSTR lpUserNameBuff)
此函数是用来取用户名的,并将取到的用户名放入lpUserNameBuff中,并返回取到的字节数。要在VB 中使用该函数,先声明一下:
Public Declare Function GetUserName Lib "Handle.dll" (ByVal lpUserNamebuff As String) As Long
好了,可以这样用:
Dim lpUserName as String * 16
GetUserName lpUserName
MsgBox lpUserName
同样,如果你这样:
Dim lpUserName as String
GetUserName(lpUserName)
MsgBox lpUserName
……….
可要后果自负呀!哈哈….
好了,这个*号是不是很神奇?赶紧动手试试吧!