Utiliser VarPtr pour retrouver StrPtr

Résolu
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 22 janv. 2006 à 04:00
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur 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)

5 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 janv. 2006 à 04:18
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
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 janv. 2006 à 16:58
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 janv. 2006 à 17:21
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.
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
22 janv. 2006 à 17:27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
22 janv. 2006 à 17:41
Merci pour l'info
0
Rejoignez-nous