Когда вы передаете параметр по ссылке (ByRef
- обратите внимание, что это неявное значение по умолчанию ), а затем назначаете его в этой процедуре ...
Public Sub DoThing(ByRef value As Long)
value = 42
End Sub
Затем вызывать этой процедуре вам нужно дать ей аргумент - если вы просто дадите ей литерал ...
DoThing 10
... тогда ничего не произойдет, указатель переменной просто выпадет из области видимости. Но дайте ему локальную переменную ...
Dim local As Long
DoThing local
Debug.Print local
И это должно вывести 42
.
Это именно то, что здесь происходит, за исключением того, что вместо локальной переменной это UDT член - TS изложил это кратко:
GetDiskFreeSpaceEx
заполняет это - TS 8 минут go
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
параметров, которые она принимает - обратите внимание, что входные данные передаются по значению (ByVal
).
Я не понимаю, почему обе записи заполняются, а не только одна, например
Предполагая, что "записи" относятся к UDT члены lngLower
и lngUpper
, это действительно то, что делает UDT ... Вам нужно немного поиграть с ними, посмотреть, как они работают. Попробуйте создать свою собственную процедуру, которая принимает UDT:
Public Sub DoThing(ByRef value As LargeInt)
value.lngLower = 1
value.lngUpper = 2
End Sub
Функция API делает в точности то же самое - есть два значения, потому что LargeInt
- это два значения.