Private Declare Function GetSystemDirectory Lib "kernel32" Alias
_
"GetSystemDirectoryA" (ByRef lpBuffer As Byte, ByVal nSize As
Long) As Long
Private Sub Form_Click() Dim n As Integer Dim
Buffer() As Byte Dim strA as String
Buffer=Space$(256) n =
GetSystemDirectory(Buffer(0),
256) strA=StrConv(Buffer,vbUnicode) strA = Left$(strA,
n) Print strA End
Sub 不知道读者注意到没有,第二段代码中的GetSystemDirectory
API函数的声明已经改变了。第一个参数的声明由一个ByVal字符串变成了一个ByRef的Byte数组,即由声明:
ByVal lpBuffer As String 变成了:
ByRef lpBuffer As
Byte 传递字符串时,需要一个ByVal修饰符来把字符串缓冲区传递到API函数中,因为字符串变量实际上指示了字符串内容所在的内存地址。在C语言术语中,这代表了一个指向指针的指针。ByVal意味着被传递的是一个指向实际字符串内容的内存地址。而在传递Byte数组Buffer(0)时,使用ByRef修饰符来传递变量,它相当于传递了数组中第一个字节内容的地址。事实上,这两种结果是一样的。
Dim Buffer() as
Byte 当你把一个字符串赋给一个动态Byte数组时,数组中的字符数将是字符串的字符数目的两倍。这是因为Visual
Basic中字符串使用Unicode,并且每个Unicode字符的实际大小是两个字节。当把一个ASCII字符转换成一个Byte数组时,数组中的另一个字节将是0。