Я не мог сделать свой заголовок описательным и кратким. Я читаю книгу под названием Power Programming с VBA, и в одном из примеров используется Windows API под названием GetWindowsDirectoryA
, который принимает параметры string lpBuffer
& long nSize
. Как только он объявлен, автор использует его в подпрограмме для извлечения каталога Windows.
Что меня смущает, так это то, как это происходит. Вот код:
#If VBA7 And Win64 Then
Declare PtrSafe Function GetWindowsDirectoryA Lib "kernel32" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
#Else
Declare Function GetWindowsDirectoryA Lib "kernel32" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
#End If
Sub ShowWindowsDir()
Dim WinPath As String * 255 'Why does this work even if I make it a regular variant string?
Dim WinDir As String
WinPath = Space(255) 'Also works fine if I change this number or comment it out, though if I comment it out, the symbols remain
WinDir = Left(WinPath, GetWindowsDirectoryA(WinPath, Len(WinPath)))
MsgBox WinDir, vbInformation, "Windows Directory"
End Sub
Нет ничего плохого в том, как это работает. Когда я наблюдаю, как он выполняется пошагово в редакторе, кажется, что он каким-то образом выполняет дополнительный шаг, который мне не очевиден.
Когда объявляется WinPath
, это пустая строка длиной 255 символов. Я не уверен, почему это необходимо, поскольку удаление строки фиксированной длины по-прежнему работает нормально.
WinPath
заполнено 255 пробелами по неизвестным причинам. Это работает так же хорошо без этого.
Вот мой парадокс. Мы передаем WinPath
в качестве аргумента Left
, но WinPath
содержит только 255 пробелов, а вторая часть Left
обычно говорит ему обрезать 1-й параметр до числа X пробелов. Как предоставление GetWindowsDirectoryA(WinPath, Len(WinPath))
обходит эту нормальную логику и неожиданно приводит к результату: "C: \ Windows"?
Мне кажется, если я пойму, как это работает, это поможет мне понять, как другие API также работают. Кстати, комментарии в коде мои, а не автора.