扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
感悟VB细水长流话API(三)
第三话 定长字符串的使用
上一话讲 lstrlen 时我们传递字符串给API时是直接传递的,相当一部分API也是这样。当然在VB中这里面是有秘密的,我们现在还不对其进行讨论,现在我要讲另一个API,它用的是定长字符串。
这是一个显示Windows的Temp目录、Windows安装目录以及System目录的路径的程序。这里用到了三个API分别得到这三个目录的路径。
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
比较一下,可以看到这三个API都用到两个参数,一个是字符串缓存,用来保存得到的路径,另一个是指定该缓存的大小。为什么这里要指定大小呢?我把我的代码贴下来,你看一看。
Private Sub Form_Load()
Dim sPath As String * 260, lLen As Long
lLen = GetTempPath(260, sPath)
Text1 = Left(sPath, lLen)
lLen = GetWindowsDirectory(sPath, 260)
Text2 = Left(sPath, lLen)
lLen = GetSystemDirectory(sPath, 260)
Text3 = Left(sPath, lLen)
End Sub
我的sPath是让API去赋值的,因此必须指定大小,以避免当缓存比API要填充的字符串还小时出现错误。它们的返回值都是API已经填充了的字符个数。因为定长字符串长度是一定的,所以没被填充的空间仍留着,所以要用left来取出有用的部分。
我在现在讲这个例子除了它实用简单,还因为我想让你知道定义长字符串在API中的应用,而且这里有个VB的知识要跟大家讲。当我们定义一个变长的字符串变量时,VB并不会像其他变量一样马上为它分配内存,而是当赋值给它时才分配合适大小的内存来存放。
但是API并不会像VB一样为你的变量分配内存并赋值,它只是知道你想要得到一个字符串,那么它就给你,至于你的变量装不装得下,那是你的事。定长的字符在定义时,由于已经指定了大小,所以VB就同时分配了内存给它,所以在使用API填充一个字符串变量时就要用定长字符串并指定字符的大小了。
但是,是不是定义时是变长的字符串变量就无法用来让API填充呢?其实是有办法的,就是事先让VB为它分配好足够的内存。看下面:
Dim sPath As String
sPath=Space(260)
或者
sPath=String(260,0)
用这段代码来代替前面定长字符串变量的声明,得到的结果是一样的。
Space(260)把260个空格赋给了sPath变长字符串变量,因此VB此时为它分配了可容纳260个空格的内存,而String(260,0)则把260个NULL字符(ASCII码为0的字符,在API中多数代表字符串的结尾)赋给sPath,它同样因此而得到260个字节的内存空间。当然你也可以用 String(260," "),让空格来填充这个空间,效果是一样的。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者