Récupérer une chaine de caractère à partir de son pointeur d'adresse mémoire

Description

Bonjour à tous,

Voilà rien d'exceptionnel, tous les codeurs d'api en ont une comme ça, mais j'ai été confronté au problème d'avoir le pointeur d'une chaine de caractère mais pas sa valeur je pense que je ne suis pas tout seul.

Donc voilà, j'espère que ça servira ceux qui savent parfaitement à quoi ça peut leur servir (après un appel d'api généralement), sinon pour ceux qui ont des problèmes à comprendre les histoires de pointeurs et adresses mémoires (comme moi il y a quelques mois), j'ai mis une petite explication (si j'ai dit des trucs faux corrigez moi ;)

Source / Exemple :


' A placer dans un module

' permet de copier une chaine de caractère dans une autre
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long

' Permet de récupérer la chaine de caractère en mémoire à partir de son pointeur
Public Function GetStringFromPtr(ByVal lPointeur As Long) As String
    If lPointeur <> 0 Then
        GetStringFromPtr = Space(lstrlen(lPointeur))
        lstrcpy GetStringFromPtr, lPointeur
    End If
End Function

Pour ceux qui ne comprennent pas ce que c'est que les adresses mémoire et tout ça :

Chaque variable que nous utilisons en vb possède une valeur qui est stockée en mémoire.
Seulement, elle est stocké à un endroit précis en mémoire, pour pas se mélanger,
chaque variable a un petit espace mémoire réservé pour y mettre sa valeur.
Pour savoir où se trouve cette adresse mémoire, il faut la repérer, et par convention
on la repère par une adresse numérique que l'on appelle "pointeur" (l'adresse pointe vers la valeur de la variable quoi...).

à quoi ça sert : pour appeler une fonction avec des parametres,
si on lui passait en parametre les valeurs des variables (genre des string, long, objets, listview etc....),
ça voudrait dire prendre la chaine de caractère (par exemple), prendre sa valeur et
la "copier" pour la donner à la fonction... si la chaine de caractère est longue, on perd beaucoup de mémoire...
Alors pour économiser de la mémoire, on passe juste en parametre le pointeur de la
chaine de caractère, comme ça la chaine existe en un seul exemplaire, à l'adresse
mémoire numéro XXXXXX, et la fonction va travailler sur la chaine de caractère qui
existe déjà en mémoire plutot que de la copier dans un autre espace mémoire.

En gros, c'est le principe du ByVal, ByRef.
ByVal (valeur de la variable) : on passe la valeur en parametre : donc on copie la
valeur, on perd bcp de mémoire
ByRef (la variable elle-meme, c'est à dire son pointeur mémoire) : on passe l'adresse
en parametre, donc on gagne en mémoire. MAIS (attention), il faut se souvenir que la
fonction aura alors accès directement à notre variable qu'on lui a passé en parametre,
si elle modifie sa valeur dans la fonction, cela touchera également la variable du
programme principal... Des fois c'est un avantage, des fois un inconvénient...
(note : cela n'arrive pas avec ByVal)

A vous de voir, j'espère que vous y voyez un peu plus clair.

Conclusion :


Je compte sur vous pour me signaler s'il y a des bugs ;)

Une petite question également : Une fois qu'on a récupérer la chaine de caractère, faut-il libérer l'espace mémoire concerné (vu que c'est stocké dans une variable vb) ?

Codes Sources

A voir également

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.