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

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

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.