首页 > 解决方案 > 不确定如何填充用户定义的类型记录/元素

问题描述

在这段代码中,我不明白 LargeInt 类型的记录IngLowerIngUpper是如何填充的。例如,如果我将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

标签: vb6user-defined-types

解决方案


其他人已经解释过了,但是你似乎仍然很难理解它为什么起作用,让我试着澄清一下:

UDT 将其成员(在这种情况下为 2 个 Long 整数)“保存”在一个连续的内存位置,lngUpper 的第一个字节直接跟在 lngLower 的最后一个字节之后,总共占用 8 个字节(=64 位)连续内存。API GetDiskFreeSpaceEx 在作为 lpFreeBytesAvailableToCaller 等提供给它的变量的开头写入 64个连续位。因此,它“填写”了 UDT 的两个 32 位 Long 变量。


推荐阅读