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 13 370 fois - Téléchargée 717 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
BIGDAMSBIG Messages postés 27 Date d'inscription dimanche 3 juin 2007 Statut Membre Dernière intervention 25 février 2008
13 janv. 2008 à 23:10
SALUT

moi je trouve ca utile comme explication voulant gagner du temps a lire des fichiers de plus de 10 Mo en sachant qu'il ne seront pas modifiés au cour de mon programme.

je ne fais que de la lecture de donnéeS.et commencant les apis de windows je comprends mieux l'intéret de la reférence qui est comme prendre la valeur d'une adresse
seulement a un instant donnée un peu comme un pointeur.

merci d'apporter a mon ignorance un peu de clareté
c'est plus un tutorial qu'un code

finit les byval sur des donnees qui ne changent jamais
au cour de mon programme.

merci MadMAxx
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
9 mars 2007 à 21:31
Ok merci c'est fait ;)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
9 mars 2007 à 21:00
<>0 fera l'affaire ^^

le signe, ca n'est qu'une question de représentation...
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
9 mars 2007 à 20:47
ah ouais ? je savais pas, c'est mieux que j'enlève totalement le test ou je met <> 0 selon toi ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
9 mars 2007 à 09:45
j'aime pas trop le > 0

en fait, en VB le Long est forcément signé...
ce qui fait que -123456 pourrait être un pointeur de chaine valide...
Afficher les 20 commentaires

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.