Utiliser VarPtr pour retrouver StrPtr [Résolu]

Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
- - Dernière réponse : cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
- 22 janv. 2006 à 17:41
Salut
Je suis en train de préparer la mutation de mes programmes VB6 en Net.

StrPtr (VB) fournit l'adresse mémoire du contenu de la chaine
VarPtr (API) fournit l'adresse mémoire de la variable contenant la chaine

Puisque .Net ne voudra plus entendre parler de StrPtr, existe t-il une manière en VB6 de récupérer StrPtr en utilisant VarPtr ?

En fait, c'est pour faire fonctionner des fonctions de DLL du genre (SubClassing) :
Call CopyMemory(ByVal (nAddrWnd + PATCH_0A), ByVal StrPtr(sAscii), LenB(sAscii))

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Afficher la suite 
A voir également:

5 réponses

Meilleure réponse
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
3
Merci
en VB6 facile.

en .Net je ne crois pas que ce soit possible







Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)



Private Sub Command1_Click()

Dim ch As String

Dim Ptrvar As Long

Dim Strvar As Long



ch = "blablabla"



Ptrvar = VarPtr(ch)

CopyMemory Strvar, ByVal Ptrvar, 4



MsgBox Strvar

MsgBox StrPtr(ch)



End Sub

Daniel

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Merci Gobillot

En fait, je viens de trouvé mon erreur grace à toi. Je me suis trop compliqué la vie.
VarPtr est une fonction appartenant à la msvbvm60.dll, donc à VB6.
J'ai voulu déclarer cette fonction alors qu'elle est native dans VB6, or la déclaration que j'utilisais n'était pas correcte ... Je l'avais déclaré comme ça
Private Declare Function VarPtr_Sting Lib "msvbvm60.dll" Alias "VarPtr" (Ptr As String) As Long
En fait, je tombais dans le panneau de la différence entre une String VB et un tableau de Bytes.
Bref, je me suis torturé pour rien. Merci de m'avoir ouvert les yeux, lol.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Non, en fait, il faut que je fasse aussi disparaitre VarPtr car elle n'est pas non plus supportée, bien sûr, puisqu'elle appartient à la library de VB6.
Je vais réétudier le problème au moment de la traduction VB6 --> Net, car je pense que Net a une solution interne pour gérer le SubClassing (and Co) qui fera disparaitre l'utilisation de VarPtr.
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
je me disais, une API Varptr() que je ne cannais pas !

il y a bien celles ci, mais l'une c'est pour un objet et l'autre pour un tableau d'array.








Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long





Declare Function VarPtrArray Lib "msvbvm50.dll" Alias
"VarPtr" (Ptr() As Any) As Long



( msvbvm50.dll ou msvbvm60.dll ?)



en Net, il y aurait ceci:

cf : http://www.vbfrance.com/code.aspx?ID=22001
<ol>
<li>
Public
Function
VarPtr(ByVal o As Object) As Integer</li><li> </li><li>
Dim
GC As System.Runtime.InteropServices.GCHandle =
System.Runtime.InteropServices.GCHandle.Alloc(o,
System.Runtime.InteropServices.GCHandleType.Pinned)</li><li> </li><li>
Dim
ret As Integer = GC.AddrOfPinnedObject.ToInt32</li><li> </li><li>GC.Free()</li><li> </li><li>
Return
ret</li><li> </li><li>
End
Function
</li>
</ol>
je te laisse le soin de tester, n'ayant aucune envie d'installer et encore moins de pratiquer Net.

il reste encore CopyMemory qui n'est pas non plus évident en Net.




Daniel
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
Merci pour l'info

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.