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

Soyez le premier à donner votre avis sur cette source.

Vue 12 633 fois - Téléchargée 662 fois

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

Ajouter un commentaire

Commentaires

bouv
Messages postés
1429
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
-
Cela semble vraiment pas mal mais pourrais tu mettre un projet avec un exemple d'utilisation.
MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
salut bouv, pas de problème pour l'exemple d'utilisation, je l'ai mis.
Mais je ne sais pas comment je me suis débrouillé, dans mon exemple ça marche pas lol... Oula je suis vraiment fatigué, pourtant dans mon prog qui l'utilise ça marche. Ici ça ne me renvoie que la première lettre du contenu de la chaine de caractère.
En meme temps, mon pc tourne depuis super longtemps et je lui en fait voir de toutes les couleurs avec mes tests sur ces api, depuis plusieurs heures je n'arrete pas d'avoir des "VB6 va etre fermé pour cause d'erreur, voulez vous envoyer un rapport à MS..." Et autres bugs
Je vais redémarrer et retenter voir si ça marche mieux.

Est ce que quelqu'un pourrait tester ce que j'ai mis voir si ça marche chez lui (ou alors si quelqu'un qui s'y connait voit une grossière erreur que j'ai fait dans mon code ^^)
Merci
cs_Willi
Messages postés
2377
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
16 -
Bonne démo, les prochaines fois pense à déposer ce genre de code tout pret (snippet) sur www.codyx.org.

Bonne continuation ++
Renfield
Messages postés
17283
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
56 -
j'aime pas trop le coup du
Space(256)

lstrlen pourrait directement te filer la bonne taille a allouer
MadM@tt
Messages postés
2215
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
Willi > Tu as complètement raison je n'y avais pas du tout pensé, dès que je résoud mon petit problème je l'y met.
Renfield > Merci pour l'info, j'ai mis à jour.

Par contre j'ai toujours un bug dans l'exemple que j'ai mis dans le zip, et j'ai remarqué que dans le prog où je l'utilise j'obtient quelque fois des erreurs. Quelqu'un voit d'où ça vient ?

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.