|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
RÉCUPÉRER UNE CHAINE DE CARACTÈRE À PARTIR DE SON POINTEUR D'ADRESSE MÉMOIRE
Information sur la source
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
- ' 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.
' 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) ?
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 08 août 2006 23:37:11 :
- Ajout d'un zip d'exemple
- 09 août 2006 15:48:15 :
- ajout de lstrlen
- 09 août 2006 17:52:06 :
- mise en mémoire de la chaine de caractère
- 09 août 2006 17:54:34 :
- bug résolu
- 09 août 2006 17:55:57 :
- mise à jour
- 09 mars 2007 21:31:01 :
- Changement du test de >0 à <>0
- 09 mars 2007 21:34:17 :
- légère modif du texte
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
tableau de chaine...subtile. [ par rurouni ]
bon, je suis pas encore le pro du VB...donc je vous pose mon probleme...J ai declare un tableau de string comme ca:Dim tab_str(10) As String * 9pour a
adresse mémoire d'une variable ou d'un objet [ par chrbard ]
quel est le moyen en visaul basic pour connaitre l'adresse mémoire d'une variable ou d'un objet ?merci
adresse mémoire [ par chrbard ]
quel est le moyen ene visaul basic d'obtenir en cours d'execution de programme l'adresse mémoire d'une variable ou d'un objet ? merci
Manipulation de chaine de caractères ... [ par ALBRECHOGAN ]
Bonjour ...En fait, j'aurais voulu savoir comment m'y prendre pour manipuler des string (c ce que j'appelle chaine de caracteres) ...J'aurais en effet
PRobleme dans une recherche de texte... [ par Clonk ]
j'effectue une recherche dans un fichier texte pour récupérer 2 valeurs et les incorporer dans une base, mais j'ai un problème, voilà mon code:Private
Chaine de caractere [ par Frank19 ]
Jai une chaine de caractere du style :dim TextRecu1 as stringTcpclient.getdata (TextRecu1)...Le TextRecu1 est égale à MmessageCe que je veux faire, c'
COMMENT LIRE UNE ADRESSE MéMOIRE D'UN PROGRAMME OUVERT ??? [ par TheBabyCool ]
J'aimerai pouvoir lire une adresse mémoire d'un jeu ou d'un programme ouvert pour pouvoir, par exemple faire un trainer, ou tromper certain programme.
COMMENT LIRE UNE ADRESSE MéMOIRE D'UN PROGRAMME OUVERT ??? [ par TheBabyCool ]
J'aimerai pouvoir lire une adresse mémoire d'un jeu ou d'un programme ouvert pour pouvoir, par exemple faire un trainer, ou tromper certain programme.
COMMENT LIRE UNE ADRESSE MéMOIRE D'UN PROGRAMME OUVERT ??? [ par TheBabyCool ]
J'aimerai pouvoir lire une adresse mémoire d'un jeu ou d'un programme ouvert pour pouvoir, par exemple faire un trainer, ou tromper certain programme.
COMMENT LIRE UNE ADRESSE MéMOIRE D'UN PROGRAMME OUVERT ??? [ par TheBabyCool ]
J'aimerai pouvoir lire une adresse mémoire d'un jeu ou d'un programme ouvert pour pouvoir, par exemple faire un trainer, ou tromper certain programme.
|
Téléchargements
Logiciels à télécharger sur le même thème :
|