Accueil > > > RÉCUPÉRER UNE CHAINE DE CARACTÈRE À PARTIR DE SON POINTEUR D'ADRESSE MÉMOIRE
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) ?
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
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
GlobalAlloc et le partage d'adresse mémoire [ par jack ]
Salut à tou(te)s Je n'ai déjà pas beaucoup de cheveux, mais là, j'arrive encore à me les arracher. J'ai une chaine à transmettre entre deux applicati
Besoin Aide Concaténation en VB ?? [ par nico8001 ]
Bonjour, j'ai un probleme pour mon projet en visual basic 2008 enfaite j'ai une base de données access 2000 avec 4 champs ( N°Machine , NomMachine
erreur lors de l'xecution de mon programme [ par tif27940 ]
Bonjour, voici mon programme : [code=aspx] Dim nom As String Dim pnom As String Dim civ As String Dim tel As String D
Presence d'un caractere parmi une serie dans une chaine string [ par PeD ]
Existe t il une fonction qui permette de savoir si une chaine contient un des caractères spécifiés dans l'argument de recherche. Certains langages ( P
Commen changer un pointeur(long) en string? [ par JSilvere ]
Bonjour, j'utilise une Dll qui me renvoi un pointeur, et j'aimerais le traduire en string afin de savoir à quoi cela correspond... Donc si quelqu'un
garder mémoire un textbox [ par sancho12345 ]
Bonsoir à tous, Comment peux ton faire pour garder mémoire un textbox. Exemple : Lorsque j’ouvre VB 6 j’aimerais que le texte que j’ai tapé dans le
Comment implémenter en une seule fois une variable String [ par FunMagic ]
Bonjour à tous, Je me creuse la tête car j'ai un soucis d'ordre général avec l'accès à des données. En résumer, j'ai un programme qui doit faire cert
[déplacé VB.NET -> VBA] Soucis dans l'emploi d'une string en argument [ par NoEnclumeSVP ]
Salut, Je dois développer une macro Excel qui doit aller chercher dans une feuille une liste d'entités (des clients) qui serviront dans une autre feu
fonction [ par parkerandrea ]
slt à tous je voudrais savoir comment appelé une fonction dans une form enplus qui peut m'aide a savoir ce ki ne va sur ce code ca ne marche chez et
|
Derniers Blogs
ASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHEASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHE par fathi
Tout le monde est unanime pour dire que la programmation multi-thread et asynchrone est en train de devenir un sujet incontournable. Beaucoup de choses sont arrivées avec le framework 4 pour le code parallèle (TPL, PLinq,.) et bientôt, on va avoir l...
Cliquez pour lire la suite de l'article par fathi PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS !PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS ! par Etienne Margraff
J'ai récemment eu un problème pour obtenir l'intelliTrace sur un site web dans IIS. Il n'y avait pas de message d'erreur, rien dans le journal d'évènement Windows, et après 3 appels à une voyante, 2 visites chez un marabou, j'ai failli me résign...
Cliquez pour lire la suite de l'article par Etienne Margraff OFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONSOFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONS par junarnoalg
De nombreuses entreprises font le choix de SharePoint Online, service fourni au travers de l'offre de Microsoft Office 365. S'il est vrai que ce choix apporte un grand nombre d'avantages; rapidité de mise en ½uvre, disponibilité, large couvertu...
Cliquez pour lire la suite de l'article par junarnoalg PRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGEPRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGE par richardc
http://www.c2idotnet.com/articles/presentation-des-api-rest-de-windows-azure-lister-les-comptes-de-storage
Désolé pour "toto", mais c2i existait avant blogs.developpeur.org et c'est mon site "officiel" ;-) ...
Cliquez pour lire la suite de l'article par richardc
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|