是有不一样的地方。看看下面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)来初始化呢??

解决方案 »

  1.   

    我把 S2 = String(255, 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  (第二句调试有很多空格)
      

  2.   

    除了用chr(0)外,还可以用vbnullchar,space(255),string(255,"a")等. 如果用字符“a”的话,你会发现返回值中a的前面有一个空格,即字符串结束符“\0”,这是C语言定义的。正因为这样,返回实际的长度可以这样计算:left(s2,instr(s2,chr(0))-1)
    凡是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
      

  3.   

    结论:Trim只能去空格,而chr(0)并非空格.
    再看看下面这个程序:
    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
    不知道我说清楚没有?
      

  4.   


    太谢谢你了,,看完这里我学到很多VB里面的细致问题,,谢谢  也感谢5L