Ces deux fonctions permettent de faire les fonctions Peek et Poke de QBasic.
Celles-ci permettent d'écrire et de lire directement dans une adresse mémoire.
Elles ne font pas apellent à la DLL habituellement utilisée dans ce genre de
situation: INPOUT32.DLL
ATTENTION: cette routine semble ne pas fonctionner sous winxp
Source / Exemple :
'déclarations API (pour les deux fonctions)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As _
Any, Source As Any, ByVal Bytes As Long)
Function Peek(ByVal Addresse As Long, ByVal ValueType As VbVarType) As Variant
'Permet de lire une valeur d'une adresse mémoire
Select Case ValueType
Case vbByte
Dim valueB As Byte
CopyMemory valueB, ByVal Addresse, 1
Peek = valueB
Case vbInteger
Dim valueI As Integer
CopyMemory valueI, ByVal Addresse, 2
Peek = valueI
Case vbBoolean
Dim valueBool As Boolean
CopyMemory valueBool, ByVal Addresse, 2
Peek = valueBool
Case vbLong
Dim valueL As Long
CopyMemory valueL, ByVal Addresse, 4
Peek = valueL
Case vbSingle
Dim valueS As Single
CopyMemory valueS, ByVal Addresse, 4
Peek = valueS
Case vbDouble
Dim valueD As Double
CopyMemory valueD, ByVal Addresse, 8
Peek = valueD
Case vbCurrency
Dim valueC As Currency
CopyMemory valueC, ByVal Addresse, 8
Peek = valueC
Case vbDate
Dim valueDate As Date
CopyMemory valueDate, ByVal Addresse, 8
Peek = valueDate
Case vbVariant
'dans ce cas il n'y a pas besoin de variable intermédiaire
CopyMemory Peek, ByVal Addresse, 16
Case Else
Err.Raise 1001, , "Type inconnnu"
End Select
End Function
Sub Poke(ByVal Addresse As Long, value As Variant, Optional ByVal ValueType As VbVarType = -1)
'écrire une valeur n'importe ou dans la mémoire
'la valeur est écrite dans le format indiqué par le second argument
'cependant vous pouvez forcer le type par le troisième argument
'ATTENTION !!
'Cette sub ne supporte ni les Strings ni les Objets
If ValueType = -1 Then ValueType = VarType(value)
Select Case ValueType
Case vbByte
CopyMemory ByVal Addresse, CByte(value), 1
Case vbInteger
CopyMemory ByVal Addresse, CInt(value), 2
Case vbBoolean
CopyMemory ByVal Addresse, CBool(value), 2
Case vbLong
CopyMemory ByVal Addresse, CLng(value), 4
Case vbSingle
CopyMemory ByVal Addresse, CSng(value), 4
Case vbDouble
CopyMemory ByVal Addresse, CDbl(value), 8
Case vbCurrency
CopyMemory ByVal Addresse, CCur(value), 8
Case vbDate
CopyMemory ByVal Addresse, CDate(value), 8
Case vbVariant
CopyMemory ByVal Addresse, value, 16
Case Else
Err.Raise 1001, , "Type inconnu"
End Select
End Sub
Conclusion :
Cependant, il faut faire très attention avec ces deux fonctions qui permettent d'écrire
et de lire directement le contenu d'une adresse mémoire car si l'on écrit dans un espace
réservé à une application cette dernière risquerait de fonctionner bizarrement ou meme
d'entrainer un crash de Windows. :(
Ti£oi$
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.