Известно, что рантайм-библиотека ВБ6 экспортирует около тысячи функций. Некоторые из них могут пригодиться нам в наших программах. Вот те из них, смысл которых я смог выяснить:
1. Функции передачи данных.
Private Declare Sub CopyBytes Lib "MSVBVM60.DLL" Alias "__vbaCopyBytes" (ByVal Size As Long, Dest As Any, Source As Any) 'Аналогично RtlMoveMemory, но только для неперекрывающихся блоков Private Declare Sub CopyBytesZero Lib "MSVBVM60.DLL" Alias "__vbaCopyBytesZero" (ByVal Size As Long, Dest As Any, Source As Any) 'То же, причём после копирования обнуляются Size байт источника
Private Declare Function GetLong Lib "MSVBVM60.DLL" Alias "VarPtr" (ByVal Value As Long) As Long 'Возвращает переданное значение (полезно для тайпкастов)
Private Declare Sub CopyByte Lib "MSVBVM60.DLL" Alias "GetMem1" (ByVal Source As Long, Dest As Byte) Private Declare Sub CopyInteger Lib "MSVBVM60.DLL" Alias "GetMem2" (ByVal Source As Long, Dest As Integer) Private Declare Sub CopyLong Lib "MSVBVM60.DLL" Alias "GetMem4" (ByVal Source As Long, Dest As Long) Private Declare Sub CopyCurrency Lib "MSVBVM60.DLL" Alias "GetMem8" (ByVal Source As Long, Dest As Currency) 'Работают как PEEK: передают значение из памяти в переменную Private Declare Sub CopyObject Lib "MSVBVM60.DLL" Alias "GetMemObj" (ByVal Source As Long, Dest As Object) 'То же, причём корректно работает со счётчиками ссылок объектов Private Declare Sub CopyString Lib "MSVBVM60.DLL" Alias "GetMemStr" (ByVal Source As Long, Dest As String) 'То же, причём корректно освобождает/выделяет память Private Declare Sub CopyVariant Lib "MSVBVM60.DLL" Alias "GetMemVar" (ByVal Source As Long, Dest As Variant) 'Объединение двух предудущих вариантов
Private Declare Sub StoreByte Lib "MSVBVM60.DLL" Alias "PutMem1" (ByVal Dest As Long, ByVal Value As Byte) Private Declare Sub StoreInteger Lib "MSVBVM60.DLL" Alias "PutMem2" (ByVal Dest As Long, ByVal Value As Integer) Private Declare Sub StoreLong Lib "MSVBVM60.DLL" Alias "PutMem4" (ByVal Dest As Long, ByVal Value As Long) Private Declare Sub StoreCurrency Lib "MSVBVM60.DLL" Alias "PutMem8" (ByVal Dest As Long, ByVal Value As Currency) 'Работают как POKE: передают значение в память Private Declare Sub StoreObject Lib "MSVBVM60.DLL" Alias "SetMemObj" (ByVal Dest As Long, ByVal Value As Object) Private Declare Sub StoreVariantObject Lib "MSVBVM60.DLL" Alias "SetMemVar" (ByVal Dest As Long, ByVal Value As Variant) 'То же, причём корректно работают со счётчиками ссылок объектов Private Declare Sub StoreString Lib "MSVBVM60.DLL" Alias "PutMemStr" (ByVal Dest As Long, ByVal lpOleStr As Long) Private Declare Sub StoreVariantNotObject Lib "MSVBVM60.DLL" Alias "PutMemVar" (ByVal Dest As Long, ByVal Value As Variant) 'То же, причём корректно освобождают/выделяют память
'2. Функции работы с SAFEARRAY-ями.
Private Declare Sub ArrayRebase1 Lib "MSVBVM60.DLL" Alias "__vbaAryRebase1Var" (Ary As Variant) 'Изменяет нижнюю границу массива на 1 'Аналогично ReDim Preserve Ary(1 To UBound(Ary) - LBound(Ary) + 1), но быстрее
Private Declare Function AryPtr Lib "MSVBVM60.DLL" Alias "VarPtr" (Ary() As
Long) As Long
'Возвращает указатель на lpSAFEARRAY
'Пример использования:
'Dim v(), lpSAFEARRAY As Long
' v() = Array("First", "Second", "Last")
' CopyLong AryPtr(v()), lpSAFEARRAY
Private Declare Function ArrayAddress Lib "MSVBVM60.DLL" Alias "__vbaRefVarAry" (Ary As Variant) As Long 'Возвращает указатель на lpSAFEARRAY 'Пример использования: 'Dim v, lpSAFEARRAY As Long
' v = Array("First", "Second", "Last")
' CopyLong ArrayAddress(v), lpSAFEARRAY
Private Declare Function ElementAddress Lib "MSVBVM60.DLL" Alias "__vbaDerefAry1" (ByVal lpsaAry As Long, ByVal Index0 As Long) As Long 'Возвращает адрес элемента SAFEARRAY-я (элементы индексируются с 0) 'Пример использования:
' Debug.Print ElementAddress(lpSAFEARRAY, 0)
Private Declare Function vbaLBound Lib "MSVBVM60.DLL" Alias "__vbaLbound" (ByVal Dimension As Integer, ByVal lpsaAry As Long) As Long Private Declare Function vbaUBound Lib "MSVBVM60.DLL" Alias "__vbaUbound" (ByVal Dimension As Integer, ByVal lpsaAry As Long) As Long 'Возвращают нижнюю и верхнюю границы любого измерения SAFEARRAY-я 'Пример использования:
' Debug.Print vbaLBound(1, lpSAFEARRAY)
' Debug.Print vbaUBound(1, lpSAFEARRAY)
'3. Другие функции.
Private Declare Function HalfPrevDWord Lib "MSVBVM60.DLL" Alias "__vbaLenBstr" (ByVal Address As Long) As Long 'Возвращает половину двойного слова [Address - 4] (может, кому-то
пригодится)
Private Declare Sub AddRef Lib "MSVBVM60.DLL" Alias "__vbaObjAddref" (ByVal Obj As Object) 'Увеличивает счётчик ссылок объекта