正如我提到的,一种方法是使用
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