Ну, как я уже упоминал, можно использовать функцию VarPtr
для поиска значения. Метод CopyMemory Api перемещает значение в адресе поиска в новую переменную.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As _
Any, source As Any, ByVal bytes As Long)
' read a value of any type from memory
Function Peek(ByVal address As Long, ByVal ValueType As VbVarType) As Variant
Select Case ValueType
Case vbByte
Dim valueB As Byte
CopyMemory valueB, ByVal address, 1
Peek = valueB
Case vbInteger
Dim valueI As Integer
CopyMemory valueI, ByVal address, 2
Peek = valueI
Case vbBoolean
Dim valueBool As Boolean
CopyMemory valueBool, ByVal address, 2
Peek = valueBool
Case vbLong
Dim valueL As Long
CopyMemory valueL, ByVal address, 4
Peek = valueL
Case vbSingle
Dim valueS As Single
CopyMemory valueS, ByVal address, 4
Peek = valueS
Case vbDouble
Dim valueD As Double
CopyMemory valueD, ByVal address, 8
Peek = valueD
Case vbCurrency
Dim valueC As Currency
CopyMemory valueC, ByVal address, 8
Peek = valueC
Case vbDate
Dim valueDate As Date
CopyMemory valueDate, ByVal address, 8
Peek = valueDate
Case vbVariant
' in this case we don't need an intermediate variable
CopyMemory Peek, ByVal address, 16
Case Else
Err.Raise 1001, , "Unsupported data type"
End Select
End Function
Это может быть использовано как
Public Sub await(ByRef waitUntil As Boolean, Optional ByVal tickFrequency As Double = 1)
this.conditionAddress= VarPtr(waitUntil) 'only creates a copy, doesn't point to the same variable
startTicking tickFrequency, Me
End Sub
Public Sub Tick()
If Peek(this.conditionAddress, vbBoolean) Then 'If initially False then will never be updated to True
stopTicking
RaiseEvent Complete
Else
RaiseEvent Tick
End If
End Sub
для проверки значения переменной каждые Tick