不知道如何填充用户定义的类型记录/元素

问题描述 投票:0回答:1

在此代码中,我不明白如何填充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
vb6 user-defined-types
1个回答
0
投票

当您通过引用传递参数(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成员lngLowerlngUpper的,实际上这正是UDT的工作...您需要与他们一起玩一点,看看它们是如何工作的。尝试制作自己的过程并采用UDT:

Public Sub DoThing(ByRef value As LargeInt)
    value.lngLower = 1
    value.lngUpper = 2
End Sub

API函数的作用几乎就是-有两个值,因为LargeInt is两个值。

© www.soinside.com 2019 - 2024. All rights reserved.