Désolé d'être exigent... mais c'est toujours pas cela...
Tes propositions sont très bonnes et c'est vraiment sympa d'essayer de trouver la solution, mais ça ne marche toujours pas...
CopyMemoryRead va lire la valeur qui se trouve à une certaine adresse mémoire et la copie dasn une variable de destinataion ( j dans l'exemple de code).
la variable i et j ne pointe donc pas sur la même zone mémoire...
pour tester, il te suffit de faire à la fin de ton code :
i = 20
Msgbox Cstr(i)+" "+cstr(j)
Et là, tu remarques que j ne vaut pas 20... il ne pointe donc pas sur la même zone mémoire que la variable i (car sinon, il vaudrait aussi 20).
Bien essayé en tous cas... mais il faut laisser tomber l'API CopyMemory, car je ne veux surtout pas copier une zone mémoire, je veux simplement partagé une seule et unique zone mémoire pour plusieurs variables . (on dit qu'elles pointent sur cette emplacement mémoire).
Dur dur en VB......... :(
-------------------------------
Réponse au message :
-------------------------------
> Here is your answer !
>
> just copy paste into a project
>
> Option Explicit
>
> Private Declare Sub CopyMemory Lib "kernel32" _
> Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
> Private Declare Function GetProcessHeap Lib "kernel32" () As Long
> Private Declare Function HeapAlloc Lib "kernel32" _
> (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
> Private Declare Function HeapFree Lib "kernel32" _
> (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
> Private Declare Sub CopyMemoryWrite Lib "kernel32" Alias _
> "RtlMoveMemory" (ByVal Destination As Long, Source As Any, ByVal Length As Long)
> Private Declare Sub CopyMemoryRead Lib "kernel32" Alias _
> "RtlMoveMemory" (Destination As Any, ByVal Source As Long, ByVal Length As Long)
>
> Private Sub Form_Load()
> Dim ptr As Long 'int * ptr;
> Dim hHeap As Long
> hHeap = GetProcessHeap()
> ptr = HeapAlloc(hHeap, 0, 2) 'an integer in Visual Basic is 2 bytes
> If ptr <> 0 Then
> 'memory was allocated
> 'do stuff
> Dim i As Integer
> i = 12
> CopyMemoryWrite ptr, i, 2 ' an intger is two bytes
> Dim j As Integer
> CopyMemoryRead j, ptr, 2
> MsgBox "The adress of ptr is " & CStr(ptr) & _
> vbCrLf & "and the value is " & CStr(j)
> HeapFree GetProcessHeap(), 0, ptr
>
> MsgBox i & " " & j
> End If
> End Sub
>
>
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > Je connais la différence entre ByVal et ByRef au niveau des passages de paramètres dans une fonction VB...
> > Et ça ne répond pas à mon problème, car tu n'a pas déclaré une 2ème variable strContenu2. C'est le paramètre...
> > Et comme il est passé par référence ByRef(on dit aussi par adresse), on accède bien au même contenu mémoire...
> >
> > JE suis Ok avec cela, mais par contre, comme je le dis, ça ne répond pas à mon problème, car tu n'as pas déclaré une véritable 2ème variable différente...
> >
> > Je voudrais un truc du genre :
> >
> > **********************
> > Dim strContenu1 As String
> > Dim pointeur As Long
> > Dim strContenu2 As String
> >
> > strContenu1 = "123fdjhjjjkn,gdfsnlkjhkdshlk"
> >
> > 'Récupère l'adresse du bloc mémoire de strContenu1
> > pointeur = StrPtr(strContenu1)
> >
> > FaitPointer(strContenu2,pointeur,len(strContenu1))
> >
> > Je veux que la fonction 'FaitPointer' fasse pointer strContenu2 sur la zone mémoire contenant la variable strContenu1.
> >
> > Ainsi, ces 2 variables se partage la même zone mémoire.
> >
> > Si strContenu1 est modifié, alors strContenu2 est modifié...
> >
> > C'est EXACTEMENT la notion de pointeurs, très utilisé en C, C++ ....... et très très pratique au niveau performance...
> >
> > Mais en VB.... :( ........ j'commence à baisser les bras....
> >
> >
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > I'm going to give a try ; don't shoot me !
> > >
> > >
> > > Private Sub Command1_Click()
> > >
> > > Dim strContenu1 As String
> > >
> > > strContenu1 = "aaa"
> > >
> > > test strContenu1
> > >
> > >
> > > End Sub
> > >
> > > Sub test(ByRef strContenu2 As String)
> > >
> > > ' NOT byVal
> > >
> > > MsgBox strContenu2
> > >
> > > 'pointer strContenu2 same as strContenu1
> > >
> > > End Sub
> > >
> > >
> > >
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > Exactement...
> > > >
> > > > Mais comment faire pointer une variable VB sur une Zone mémoire déjà alloué...
> > > > Il y a 2 choses à préciser :
> > > > - l'adresse mémoire du début de la données
> > > > - sa longueur (offset)
> > > >
> > > > Et éventuellement son type de données pour l'interprétation du contenu...
> > > >
> > > > Si ma données fais 3 Méga octets, je ne veu xpas qu'elle soit ptésente à 2 endroits différents de la mémoire...
> > > > Mais je veux que cette données soit accessible depuis 2 variables VB...
> > > >
> > > > Les pointeurs en C, C++ et dans tous les langages évolués et fortement typé servent entre autre à cela...
> > > > Avec VB, on ne peux pas accéder de la sorte à la mémoire, aussi facilement qu'en C... Mais je suis sûr qu'avec les API, on doit pouvoir faire des choses performantes...
> > > >
> > > > Donc mon problème revient à faire pointer plusieurs variables VB sur une zone mémoire (identitifié par son adresse de début et sa longueur en octet).
> > > >
> > > > Rien de bien compliqué dans le concept,mais alors pour le mettre en pratique en VB, c'est vraiment la galère.
> > > >
> > > > Tu comprends mieux ce que je veux faire exactement ou ne suis-je toujours pas assez précis dans ma demande ?
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > -------------------------------
> > > > Réponse au message :
> > > > -------------------------------
> > > >
> > > > > Donc en gros, tu veux uniquement copier le contenu de l'adresse mémoire ?
> > > > >
> > > > > Si c'est cà, il te suffit de copier le contenu du pointeur, non ?
> > > > >
> > > > > DARK SIDIOUS
> > > > >
> > > > > [Responsable de la rubrique API du site
www.ProgOtoP.net]
> > > > >
> > > > >
> > > > > -------------------------------
> > > > > Réponse au message :
> > > > > -------------------------------
> > > > >
> > > > > > CopyMemory permet de copier un contenu mémoire vers un autre emplacement de la mémoire.
> > > > > > C'est l'API qui doit être utilisé pour la définition de l'opérateur d'affectation '=' du langage VB.
> > > > > >
> > > > > > C'est justement ce que je veux pas faire...
> > > > > >
> > > > > > Je veux que mes 2 variables pointes sur le même emplacement mémoire...
> > > > > > Qu'elles se le partagent si tu préfères...
> > > > > >
> > > > > > Je veux donc être capable de faire pointer plusieurs variables VB sur un même emplacement mémoire...
> > > > > >
> > > > > > Or l'API CopyMémory ne permet pas de faire cela...
> > > > > >
> > > > > > Merci quand même pour ton aide...
> > > > > >
> > > > > >
> > > > > > -------------------------------
> > > > > > Réponse au message :
> > > > > > -------------------------------
> > > > > >
> > > > > > > Oui en effet, il existe l'API CopyMemory qui permet de copier le contenu de la mémoire à une adresse donnée.
> > > > > > >
> > > > > > > Pour plus d'info sur cette API, va voir dans la bibliothèque d'API du site www.ProgOtoP.com
> > > > > > >
> > > > > > > DARK SIDIOUS
> > > > > > >
> > > > > > > [Responsable de la rubrique API du site
www.ProgOtoP.net]
> > > > > > >
> > > > > > >
> > > > > > > -------------------------------
> > > > > > > Réponse au message :
> > > > > > > -------------------------------
> > > > > > >
> > > > > > > > Ma question est simple...
> > > > > > > >
> > > > > > > > Soit une variable 'strContenu1' de type String, contenant une très grosse chaine de caractère (un fichier texte de quelques Mo)...
> > > > > > > >
> > > > > > > > J'ai une autre String 'strContenu2' et je voudrais que strContenu2 pointe sur la zone mémoire de strContenu1 pour ne pas recopier ma grosse chaine en mémoire...
> > > > > > > >
> > > > > > > > Parce que l'instruction :
> > > > > > > >
> > > > > > > > strContenu2 = strContenu1
> > > > > > > >
> > > > > > > > recopie la chaine dans un autre emplacement de la mémoire vive (affectation)...
> > > > > > > >
> > > > > > > > J'arrive à récupérer l'adresse mémoire de strContenu1 avec l'instruction suivante :
> > > > > > > >
> > > > > > > > Dim pointeur as Long
> > > > > > > >
> > > > > > > > pointeur = StrPtr(strContenu1)
> > > > > > > >
> > > > > > > > Maintenant, il faut que je fasse "pointer" strContenu2 sur cette zone mémoire...
> > > > > > > > Il doit y avoir une API...
> > > > > > > >
> > > > > > > > Mais laquelle... je cherche désespérement depuis hier...
> > > > > > > >
> > > > > > > > Cela permettrait d'optimiser la performance des programmes VB... optimiser la consommation en mémoire vive...
> > > > > > > >
> > > > > > > > Merci pour votre aide...
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>