在此代码中,我不明白如何填充LargeInt类型的记录IngLower和IngUpper。例如,如果将udtFreeBytesAvail添加到监视列表并在第16行设置断点,则会填充udtFreeBytesAvail的记录,我知道这是因为API函数GetDiskFreeSpaceEx的参数,但我不明白为什么两个记录都被填充,而不仅仅是一个记录。以及为什么两个记录都有不同的值。感谢您的帮助,如果由于我是编程新手而无法很好地描述我的问题,则对不起。
Public Type LargeInt
lngLower As Long
lngUpper As Long
End Type
Public Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, lpFreeBytesAvailableToCaller As LargeInt, lpTotalNumberOfBytes As LargeInt, lpTotalNumberofFreeBytes As LargeInt) As Long
Public Function FreeDiskSpace(ByVal sDriveLetter As String) As Double
Dim udtFreeBytesAvail As LargeInt, udtTtlBytes As LargeInt
Dim udtTTlFree As LargeInt
Dim dblFreeSpace As Double
If GetDiskFreeSpaceEx(sDriveLetter, udtFreeBytesAvail, udtTtlBytes, udtTTlFree) Then
If udtFreeBytesAvail.lngLower < 0 Then
dblFreeSpace = udtFreeBytesAvail.lngUpper * 2 ^ 32 + udtFreeBytesAvail.lngLower + 4294967296#
Else
dblFreeSpace = udtFreeBytesAvail.lngUpper * 2 ^ 32 + udtFreeBytesAvail.lngLower
End If
End If
FreeDiskSpace = dblFreeSpace
End Function
当您通过引用传递参数(ByRef
-请注意它是implicit default),然后在该过程中分配它...
Public Sub DoThing(ByRef value As Long)
value = 42
End Sub
然后要调用该过程,您需要给它一个参数-如果您只给它一个字面量...
DoThing 10
...然后什么也没有发生,变量指针只是超出范围。但是给它一个局部变量...
Dim local As Long
DoThing local
Debug.Print local
并且应该输出42
。
这正是这里发生的事情,除了它不是局部变量,它是UDT成员-T.S.简而言之:
GetDiskFreeSpaceEx
填充– T.S. 8 mins ago
Public Declare Function GetDiskFreeSpaceEx Lib "kernel32.dll" Alias "GetDiskFreeSpaceExA" ( _
ByVal lpDirectoryName As String, _
lpFreeBytesAvailableToCaller As LargeInt, _
lpTotalNumberOfBytes As LargeInt, _
lpTotalNumberofFreeBytes As LargeInt) As Long
该函数本身返回一个Long
整数,但是real输出是它需要的ByRef
参数-请注意inputs由值(ByVal
)传递。
我不明白为什么两个记录都被填充,而不仅仅是一个记录
假设“记录”是关于UDT成员lngLower
和lngUpper
的,实际上这正是UDT的工作...您需要与他们一起玩一点,看看它们是如何工作的。尝试制作自己的过程并采用UDT:
Public Sub DoThing(ByRef value As LargeInt)
value.lngLower = 1
value.lngUpper = 2
End Sub
API函数的作用几乎就是-有两个值,因为LargeInt
is两个值。