Copie en memoire

cs_milo2009 Messages postés 180 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 8 août 2011 - 22 nov. 2005 à 19:11
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 22 nov. 2005 à 21:18
Salut, j'utilise cette procedure pour faire des copie :

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory"
(Destination As Any, Source As Any, ByVal Length As Long)



Cependant je me suis rendu compte que le type ANY, n'existe pas sous vb.NET.



J'ai essayé avec variantType mais ce ne fonctionne pas.



Quelqu'un a une idée ?



Merci

9 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 nov. 2005 à 19:26
Salut,
Dans ce cas, remplace Any par long (ou integer puisque integer vb.net est le long vb6). (Destination et Source sont des pointeurs).

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_milo2009 Messages postés 180 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 8 août 2011 1
22 nov. 2005 à 19:48
Merci de m'avoir répondu, cependant j'ai du mal m'expliqué.

J'ai déja testé avec d'autre type, mais ca marche pas.

voici un exemple de l'utilisation : Call CopyMem(Tab(5), Nombre, 2) ou Tab est de type byte et Nombre de type Long qui vaut = 20000.

Sous vb6, Tab prend une valeur de type byte, mais sous vb.NET comme le type ANY n'existe pas, ca ne donne pas de valeur avec les autres type.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 nov. 2005 à 20:02
Le Type Any n'exite pas non plus en Vb6

il ne sert qu'à remplacer n'importe quel type, à toi d'adapter







'à mettre en Integer pour Net

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, Source As Long, ByVal Length As Long)



Private Sub Command1_Click()

Dim table(3) As Byte

Dim nombre As Long



nombre = 1234

CopyMemory table(0), nombre, 4



MsgBox Hex$(nombre) '4D2

MsgBox Hex$(table(0)) 'D2

MsgBox Hex$(table(1)) '4

MsgBox table(2) '0

MsgBox table(3) '0



End Sub


Daniel
0
cs_milo2009 Messages postés 180 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 8 août 2011 1
22 nov. 2005 à 20:10
Je viens de testé ton code est ca plante.



Meme si tu remplace le type long en type integer, le prog plante en disant :

"La référence d'objet n'est pas définie à une instance d'un objet."
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 nov. 2005 à 20:22
pas très clair comme erreur !

qu'est-ce qui lui plait pas, peut -être l'absence de Byref ???



Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Byref Destination As Byte,Byref Source As Long, ByVal Length As Int)




je te conseille pas de mettre Byval, à moin d'avoir des pointeurs.



Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As int, ByVal Source As int, ByVal Length As Int)



CopyMemory VarPtr(table(0)), Varptr(nombre), 8



Daniel
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
22 nov. 2005 à 20:26
Une url :

http://www.codeproject.com/vb/net/netcopymemorysample.asp

Où j'ai piqué ça :

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal pDst As IntPtr, ByVal pSrc As String, ByVal ByteLen As Long)

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_milo2009 Messages postés 180 Date d'inscription vendredi 4 juillet 2003 Statut Membre Dernière intervention 8 août 2011 1
22 nov. 2005 à 20:38
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Byref Destination As Byte,Byref Source As Long, ByVal Length As Int)

CopyMemory VarPtr(table(0)), Varptr(nombre), 8

Ne fonctionne pas car vb.NET ne connais pas VarPtr

Et c'est de type long vers byte que je veux, et pas string.

Merci
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 nov. 2005 à 20:57
j'ai trouvé ça, si ça peut t'aider:

VB6
has 3 undocumented functions. VarPtr, StrPtr, and ObjPtr.StrPtr returns
object of a string, VarPtr returns address of any other variable and
ObjPtr returns address of an object. In VB.Net these 3 functions are
abosolete but their functionality is still avaliable.







Public Function VarPtr(ByVal o As Object) As Integer
Dim GC As System.Runtime.InteropServices.GCHandle =
System.Runtime.InteropServices.GCHandle.Alloc(o,
System.Runtime.InteropServices.GCHandleType.Pinned)
Dim ret As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return ret
End Function




Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 nov. 2005 à 21:18
in .NET, most usage of
CopyMemory
is inappropriate


http://www.codeproject.com/vb/net/CopyMemory_in_Net.asp

copy data from integer variable to byte array:

Imports System.Runtime.InteropServices
Imports System.Text
Dim LongValue As Integer
Dim Str As String = "Adnan Samuel"
'A byte array
Dim ByteArray () As Byte
'Convert string to byte and copy to byte array
ByteArray = Encoding.Default.GetBytes(Str)
'Create Gchandle instance and pin variable required
Dim MyGC As GCHandle = GCHandle.Alloc(LongValue, GCHandleType.Pinned)
'get address of variable in pointer variable
Dim AddofLongValue As IntPtr = MyGC.AddrOfPinnedObject()
'Use copy method to copy array data to variable’s
'address with length specified(4)
Marshal.Copy (AddofLongValue, ByteArray, 0, 4)
'First read value of variable from its address
'in memory in order to use it
LongValue = Marshal.ReadInt32(AddofLongValue)
'Print to output window
Debug.WriteLine("Vlaue of LongValue is: " & LongValue)
'Free GChandle to avoid memory leaks
MyGC.Free()



Daniel
0
Rejoignez-nous