Fonctions cachées de visual basic 6 !!!!

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 796 fois - Téléchargée 37 fois

Contenu du snippet

Voici 3 fonctions cachées de Visual Basic6 !

VarPtr() , StrPtr() , ObjPtr()

Pour l'histoire:
----------------

Il faut savoir quand meme que VarPtr() éxiste depuis QuickBasic et Visual Basic 1 !
Et oui elle était inclut dans les Runtime de VB1:

Declare Function VarPtr Lib "vbrun100.Dll" (Var As Any) As Long

Plus tard elle fut déplacée dans le msvbvm50.dll de VB5 et fut donc transformée en une simple fonction résidante.

Dim L as long
Debug.Print VarPtr(L) <- Récupère le pointeur de la variable définit en long

Pour récupérer un pointeur d'une variable en String, vous devez imposer un ByVal comme ceci:

Dim S as string
Debug.Print VarPtr(ByVal S)

Après passage au monde 32bits, windows se retrouve avec 2 norme pour les chaines de caractères: ANSI et UNICODE
au lieu de principalement ANSI avant.
Ce changement à provoquer quelque complication, dont notement le passage d'argument UNICODE à une DLL qui jusqu'a
lors ne pouvait prendre que du ANSI ou une valaur en long.

Voila pour VarPtr() à été crée (vous l'auriez compris, c'est la première fonction de nos 3 cachées crée sous VB),
dans le but d'arranger ce problème.
A la bas VarPtr() renvoi le pointeur memoire d'une variable en type long ou string.
Le problème est que pour les string ca renvoyait le pointeur mémoire de la variable mais toujours au format UNICODE.
C'est pour cela qu'il a fallut intégrer ByVal dans la fonction.
Ceci permet de récupérer en fait, le pointeur ANSI d'une chaine UNICODE !!!
De cette manière la DLL peut désormais accepter le parametre !

Suite à toute ces peripécies, à l'arrivée de VB5 et office 97, 2 autre fonctions (nos 2 autres fonctions cachées) ont été crée et déposée
dans la librairie VBa de Visual Basic 5.
Pour garder le phénomène de découverte et surtout de fonctions avancées , ces 3 fonctions n'ont jamais été documentées !
Personne n'a voulu les documenter dans les Doc officielle de VB5 et au dessus (essayez dans l'explorateur d'objet de VB6, vous ne trouverez rien !)

(Pour preuve: "To maintain the traditionally eclectic feel of VarPtr, and to stop beginning programmers from hurting themselves (read: no one wanted to document them), these declarations remain hidden." Ref: http://www.mvps.org/vb/index2.html?tips/varptr.htm )

Les fonctions:
--------------

StrPtr()
--------

StrPtr() permet de rendre plus efficace la transformation UNICODE. Exemple ci dessous avec une DLL de VB4:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (pStr As Byte)
Sub MakeCall(MyStr As String)
Dim bTmp() As Byte
bTmp = MyStr & vbNullChar
MyUnicodeCall bTmp(0)
MyStr = bTmp
MyStr = Left$(MyStr, Len(MyStr - 1))
End Sub

Dans cet exemple vous povez remarquer qu'il faut jouer directement avec un tableau de byte et la tache est un peu usine à gaz !
Maintenant avec la fonction StrPtr() :

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (ByVal pStr As Long)
Sub MakeCall(MyStr As String)
MyUnicodeCall StrPtr(MyStr)
End Sub

Tout de suite c'est deja plus simple !
StrPtr() renvoi tout simplement le pointeur d'une chaine de caractere. Et contrairement à VarPtr() c'est le contenu de la variable
qui cette fois est transformée en pointeur et non plus la variable et son type UNICODE ou ANSI qui est transformée !
Le seule problème c'est que StrPtr() accepte que le format ANSI !!! ouh la la on commence à s'y perdre !!!!

Alors pour régler cet autre problème il faut convertir la chaine de caractere UNICODE en ANSI avant d'utiliser le code !
Exemple ci dessous:

Declare Sub MyUnicodeCall Lib "MyUnicodeDll.Dll" (ByVal pStr As Long)
Sub MakeCall(MyStr As String)
MyStr = StrConv(MyStr, vbFromUnicode) <- vbFromUnicode = UNICODE -> ANSI ; vbUnicode = ANSI -> UNICODE
MyUnicodeCall StrPtr(MyStr)
End Sub

Bon voila oufff on y est arrivé !
Pour résumer StrPtr() revoi le pointeur ANSI d'une chaine ANSI qui contrairement à VarPtr() renvoi le pointeur de la variable complete !

ObjPtr()
--------

Alors la ne vous inquiétez pas le principe est beaucoup plus simple !
Cette fonction permet simplment de transformer un objet en son pointeur memoire. Je sais que le terme transformé depuis le debut
n'est pas tres approprié mais il merite d'etre clair :)
En gros lorsque que certaine API venant de DLL demande de leur faire passer un Objet en parametre mais que la declaration stipule
un format Long exigé, vous devez le transformer comme ceci:

Pointer = ObjPtr(Objet)

Attention un objet n'est pas forcement un controle mais ca peut tres bien etre une Class, une collection , etc etc etc
en gros un peu tout et n'importe quoi.
SAUF une declaration variable , sub ou fonction !

(Pour renvoyer le pointeur d'une fonction, il faut utiliser AddressOf TaFonction dans le param de l'API)

Voila voila.
Jespere avoir ete assez clair surtout que ceci est une traduction expliquée de la page: http://www.mvps.org/vb/index2.html?tips/varptr.htm

Des fautes d'orthographes , on en trouve partout , mais désolé je n'est pas lhabitude d'ecrire des roman comme ca ;)

Je tiens a remercier Medhi/Mehdibou pour la simple et bonne raison que tout cela nous l'avions trouvé, quand il ma aidé
a faire fonctionner l'API CreateThread() avec le passage de string en parametre .... chose ardue croyez moi !!!!!

Bonne progz a tous. ++++
Christophe.

Conclusion :


remerciement tout particulier a Mehdi.

A voir également

Ajouter un commentaire

Commentaires

dead33
Messages postés
29
Date d'inscription
vendredi 31 mars 2006
Statut
Membre
Dernière intervention
4 décembre 2007
-
asssssssssssezezezezezezezezezezezezezez
merci skajez :bien
en russ merci est spaciba
cs_Anotine
Messages postés
65
Date d'inscription
mardi 22 juin 2004
Statut
Membre
Dernière intervention
14 septembre 2008
-
Quelqu'un aurais une idée de la transformation en VB.NET ?! (Si je trouve je vous le dis !)

Sinon merci pour les info !
odan71
Messages postés
140
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
11 décembre 2007
-
cooooooooool, des pointeurs pour vb!!! c'est pas dommage...
merci pour ces explications.
ramanvda
Messages postés
11
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
16 juin 2015
-
Merci bcp! c'est cela que je cherché et dire que j'ai failli passé à coté!
MERCI lumesh!
cs_Snoow
Messages postés
4
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
4 novembre 2003
-
Ca, c'est un bon éclaircissement sur les pointeurs ! Très utile !

Mais comment on fait pour retrouver l'objet lorsqu'on a que le pointeur (en Long) ???

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.