是有不一样的地方。看看下面Debug.print的结果是什么?
VB codeOption Explicit
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongPrivate Sub Command1_Click()
Dim S1 As String, S2 As String
S1 = String(255, Chr(0))
S1 = "C:\WINDOWS"
S2 = String(255, Chr(0))
Call GetWindowsDirectory(S2, 256)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print S2, Len(S2), Len(Trim(S2))
———————————————————————————————————————————————————————
3L你好,,我又去试了下..好像如果是用API返回的话..无论是S2 As String * 256 还是S2=string(255,chr(0)) 他们都是一样的...请看下面的PRINT输出
C:\WINDOWS 10 10
C:\WINDOWS 256 256
——————————————————————————————
但是这样用的话 S1 = "C:\WINDOWS" 结果就有差异,,很不解..
————————————————————————————————————————--
下面是定长字符串的:
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Sub Command1_Click()
Dim S1 As String, S2 As String * 256
S1 = String(255, Chr(0))
S1 = "C:\WINDOWS"
Call GetWindowsDirectory(S2, 256)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print S2, Len(S2), Len(Trim(S2))
End Sub我想请问在API函数中为缓冲区设置大小(长度) 是不是一般都是用chr(0)来初始化呢??
VB codeOption Explicit
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongPrivate Sub Command1_Click()
Dim S1 As String, S2 As String
S1 = String(255, Chr(0))
S1 = "C:\WINDOWS"
S2 = String(255, Chr(0))
Call GetWindowsDirectory(S2, 256)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print S2, Len(S2), Len(Trim(S2))
———————————————————————————————————————————————————————
3L你好,,我又去试了下..好像如果是用API返回的话..无论是S2 As String * 256 还是S2=string(255,chr(0)) 他们都是一样的...请看下面的PRINT输出
C:\WINDOWS 10 10
C:\WINDOWS 256 256
——————————————————————————————
但是这样用的话 S1 = "C:\WINDOWS" 结果就有差异,,很不解..
————————————————————————————————————————--
下面是定长字符串的:
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Sub Command1_Click()
Dim S1 As String, S2 As String * 256
S1 = String(255, Chr(0))
S1 = "C:\WINDOWS"
Call GetWindowsDirectory(S2, 256)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print S2, Len(S2), Len(Trim(S2))
End Sub我想请问在API函数中为缓冲区设置大小(长度) 是不是一般都是用chr(0)来初始化呢??
改成了 S2 As String * 255
用API函数返回值 他们都是一样 也就是说String * 255 和 String(255, Chr(0)) 都是返回:下面这句
C:\WINDOWS 255 255 (第二句调试有很多空格)C:\WINDOWS 10 10
C:\WINDOWS 255 255 (第二句调试有很多空格)
凡是API返回的字符串均可这样计算。
定长字符串是不能用Trim去空格的,哪怕实际字符数只有10个,也不能改变字符串的长度。
在S1中,定义S1长度为255,但后来S1 = "C:\WINDOWS" & String(20, Chr(0)),S1的长度被重新定义为30,虽然后面有很多空格(即chr(0)),但不能去掉。
在API调用中S2返回的实际字符为C:\WINDOWS,但S2并没有重新定义,只是返回的字符均在缓冲区中,长度为255。
看看下面这个程序:
Option Explicit
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As LongPrivate Sub Command1_Click()
Dim S1 As String, S2 As String
S1 = String(255, "a")
S1 = "C:\WINDOWS" & String(20, Chr(0))
S2 = String(255, "a")
Call GetWindowsDirectory(S2, 256)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print S2, Len(S2), Len(Trim(S2))
Debug.Print Left(S1, InStr(S1, Chr(0)) - 1), Left(S2, InStr(S2, Chr(0)) - 1)
End Sub
再看看下面这个程序:
Option ExplicitPrivate Sub Command1_Click()
Dim S1 As String
S1 = Space(255)
S1 = "C:\WINDOWS" & Space(20)
Debug.Print S1, Len(S1), Len(Trim(S1))
Debug.Print Left(S1, InStr(S1, Chr(0)) - 1) '这句会出错,因为找不到chr(0)
End Sub
不知道我说清楚没有?
太谢谢你了,,看完这里我学到很多VB里面的细致问题,,谢谢 也感谢5L