begin process at 2012 02 13 07:32:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > FONCTIONS CACHÉES DE VISUAL BASIC 6 !!!!

FONCTIONS CACHÉES DE VISUAL BASIC 6 !!!!


 Information sur la source

Note :
9,71 / 10 - par 7 personnes
9,71 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Niveau :Initié Date de création :09/07/2003 Date de mise à jour :09/07/2003 09:04:49 Vu :14 371

Auteur : lumesh

Ecrire un message privé
Site perso
Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note

 Description

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()
--------

StrP tr() 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.


 Sources du même auteur

Source avec Zip Source avec une capture OCX - APERÇU AVANT IMPRESSION
Source .NET (Dotnet) CLASSE: CONFIGURATIONS DE SON APPLICATION
Source avec Zip Source avec une capture Source .NET (Dotnet) AVI MICRO CAM .NET
Source avec Zip Source avec une capture Source .NET (Dotnet) STREAMING AUDIO ET VIDEO
Source .NET (Dotnet) TEXTE <--> BASE64

 Sources de la même categorie

Source avec Zip DLL PERSONNALISÉ AVEC ÉVÈNEMENTS ET PROPRIÉTÉS EN VB6. par Number7
Source avec Zip Source .NET (Dotnet) EXEMPLE DU TUTORAIL "CLASSES MÉTIER" par Adn56
Source avec Zip Source avec une capture Source .NET (Dotnet) GESTION DES LISTES : RANGEMENT (LIST.SORT) ET FILTRAGE (LIST... par kbalist
Source avec Zip EXEMPLE SUR LES MENUS POUR AIDER LES DÉBUTANTS COMME MOI ;-) par viragoloco
LES OPÉRATIONS DE LA LISTE CHAINÉE par smaili

Commentaires et avis

Commentaire de doct le 09/07/2003 10:12:45

merci.
Je connaissais ObjPtr, le reste pas... tu m'a appris quelques bonnes petites choses.

Commentaire de max12 le 09/07/2003 15:51:40 administrateur CS

Ouais, interressant ce document :) Mais dans le pire des cas VarPtr existe sous forme d'API.

@+

Commentaire de mehdibou le 09/07/2003 18:44:33

Très bien trouvé :)
Moi qui adore les apis, ça va m'être très utile :D

(j'ai rien fait de spécial pour mériter tout ça ^^ ;) :-| )

Commentaire de SimonKari le 10/07/2003 08:30:02

Personne n'a songé au fait que si Micro$oft ne documente pas cela c'est qu'il vaudrait mieux ne pas l'utiliser. Car si un jour sans rien dire ils décidaient de retirer ces fonctions. Ceux qui ont utilsé ca dans leur prog seront bien embété non ?

Commentaire de lumesh le 10/07/2003 08:53:50

oui mais ses fonction sont incluse ds msvbvm60 et 50 .dll cad kelles sont ds les runtimes 5 et 6 de ton applie et non pas ds windows
donc en gros meme si ds les virent elles seront tjrs utilisablent !

Commentaire de Sirocooo le 10/07/2003 09:16:12

bon travail... mais je ne vois pas ou je pourrais utiliser ces fonctions...encore mieux je ne vois pas à quoi elles peuvenst servir...
ET oui on ne peut pas tout connaître dans la vie

Commentaire de lumesh le 10/07/2003 09:39:09

Sirocooo, c'est tres simple.
un de c 4 tu vas tomber sur une API qui va te demander de lui specifier un controle style un listview par exemple en parametre mais le pb c ke ce paramatre n'est pas au format listview, ni object, ni hwnd, mais au format long. Comment vas tu faire pour passer ce controle alors ?
tres simplement en utilisant une de ces 3 fonctions !
la fonction va te transformer ton controle en pointeur au format long, exactement ce que l'API ta demandé ! :)
voila notement a koi ca sert :)

Commentaire de Sirocooo le 10/07/2003 10:32:30

all right, merci

Commentaire de zappy le 10/07/2003 22:36:05

sympa :)

Commentaire de SimonKari le 10/07/2003 22:49:15

tu fais erreur Lumesh ! aucune api ne demandera jamais une référence à un emplacement mémoire correspondant à un control ! Il demandera le Hwnd ! Quel intérêt de savoir ou le listview (c'est ton exemple) a été mis dans la mémoire ? Strictement inutile

Commentaire de cauroir le 11/07/2003 09:18:50

Encore moi avec mon unicode : pensez vous qu'il y a moyen d'utiliser ces fonctions pour coder en unicode ? Merci

Commentaire de kelly le 11/07/2003 23:24:54

si je comprends bien , ces fonctions existent pour qu'en vb on puisse un peu utiliser les pointeurs, càd ne pas etre restreint a la gestion transparente et assez foireuse de vb de la memoire ? Y a t il pour completer efficacement ces concepts, des fonctions analogues a celles de C/C++ qui permettent d'allouer/desallouer de la memoire dynamiquement (malloc, etc. ) ?

Commentaire de lumesh le 12/07/2003 01:22:41

je tavoue jen ai aucune idee Kelly.
ces fonctions permettent la conversion de chaine type C++ en vb (encore un de leur usage)

Commentaire de dragon le 14/07/2003 20:15:37

bien trouvé, surtout avec toute l'historique en plus
par contre, dois surement pas marché sous .net

Commentaire de dragon le 15/07/2003 22:06:28

eh c'est normal que ça me dit que ça trouve pas la dll unicode ???

Commentaire de lumesh le 15/07/2003 22:56:59

oui c tout a fait normal. cette dll provient des tres ancien vb.
elle nexiste plus a lheure actuel

Commentaire de lca94 le 03/09/2003 13:17:12

super cool ... merci pour ces infos. :)

Commentaire de bbcluny le 12/09/2003 16:54:47

Existe-t-il l'équivalent en vb.net

Commentaire de lumesh le 12/09/2003 18:57:45

pas encore testé sous .Net mais je doute tres fortement ...
Le framework saborde tres diferement ....

Commentaire de Snoow le 06/11/2003 17:03:19

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) ???

Commentaire de Snoow le 06/11/2003 17:10:14

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) ???

Commentaire de ramanvda le 19/04/2004 16:26:17

Merci bcp! c'est cela que je cherché et dire que j'ai failli passé à coté!
MERCI lumesh!

Commentaire de odan71 le 18/02/2005 17:46:44

cooooooooool, des pointeurs pour vb!!! c'est pas dommage...
merci pour ces explications.

Commentaire de Anotine le 23/08/2005 18:44:31

Quelqu'un aurais une idée de la transformation en VB.NET ?! (Si je trouve je vous le dis !)

Sinon merci pour les info !

Commentaire de dead33 le 06/07/2006 18:15:07

asssssssssssezezezezezezezezezezezezezez
merci skajez :bien
en russ merci est spaciba

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales