Décodage d'URL

Le
Gloops
Bonjour tout le monde,

Pour transférer une URL de type mailto: à un autre logiciel, j'ai bes=
oin
de convertir une URL "sans espaces", style "subject:D%E9veloppeur%20VB", =

en chaîne de caractères lisible, style "subject:Développeur VB".

J'ai essayé ceci :
==
==

Public Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long)
Public Const ICU_DECODE As Long = &H10000000

Public Function DecodeURL(strURL As String) As String
Dim strTemp As String, strBuff As String
strTemp = strURL
strBuff = Space(256)
InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE
DecodeURL = Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function
==
==


Mais pas de chance, InternetCanonicalizeUrl fait simplement une copie de =

strTemp vers strBuff -et donc ma fonction aussi.

Alors quoi, je vais parcourir moi-même la chaîne pour détecter le s=
igne
pourcent, et à chaque fois que je l'aurai trouvé je vais considérer=
les
deux caractères suivants comme un nombre hexadécimal dont il faudra
fournir le caractère correspondant ?

Ben si j'avais su, je l'aurais fait tout de suite


D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors que =

ApiViewer2004 (chargé il y a quelques semaines) la déclare comme une =

Sub, donc sauf truc qui me serait passé au-dessus, sous VB, sans valeur=

de retour.
C'est quoi, que j'ai loupé ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred
Le #15409351
Dans : news:,
Gloops disait :
Bonjour tout le monde,



Bonsoir,

Pour transférer une URL de type mailto: à un autre logiciel, j'ai
besoin de convertir une URL "sans espaces", style
"subject:D%E9veloppeur%20VB", en chaîne de caractères lisible, style
"subject:Développeur VB".
J'ai essayé ceci :



InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE



ET avec :
ICU_DECODE | ICU_NO_ENCODE
?



--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Jean-marc
Le #15409321
Fred wrote:
Dans : news:,
Gloops disait :
Bonjour tout le monde,



Bonsoir,

Pour transférer une URL de type mailto: à un autre logiciel, j'ai
besoin de convertir une URL "sans espaces", style
"subject:D%E9veloppeur%20VB", en chaîne de caractères lisible, style
"subject:Développeur VB".
J'ai essayé ceci :



InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE



ET avec :
ICU_DECODE | ICU_NO_ENCODE
?



Hello,

je complète la réponse de Fred:

Attention: en VB, le "|" c'est "Or". Le |, c'est en C.

Ca donne:

' ajouter cette constante
Const ICU_NO_ENCODE As Long = &H20000000

Public Function DecodeURL(strURL As String) As String
Dim strTemp As String, strBuff As String

strTemp = strURL
strBuff = Space(256)
InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE Or
ICU_NO_ENCODE
DecodeURL = Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Gloops
Le #15409281
Jean-marc a écrit, le 04/05/2007 20:20 :

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB





Ah ben je dois dire que vous m'en bouchez un coin, tous les deux.
J'avais bien vu ICU_NO_ENCODE dans les paramètres, mais je ne me
représentais pas que la fonction s'amusait à réencoder juste aprè s avoir
décodé.

Bon, effectivement, comme ça, ça marche. Merci.

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?
Jean-marc
Le #15409261
Gloops wrote:
Jean-marc a écrit, le 04/05/2007 20:20 :

Et voila :-)

? DecodeURL("D%E9veloppeur%20VB")
Développeur VB





Ah ben je dois dire que vous m'en bouchez un coin, tous les deux.
J'avais bien vu ICU_NO_ENCODE dans les paramètres, mais je ne me
représentais pas que la fonction s'amusait à réencoder juste après
avoir décodé.

Bon, effectivement, comme ça, ça marche. Merci.

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?



En tout cas, c'est une bonne idée de nouvel article pour la FAQ VB :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Gloops
Le #15409251
Gloops a écrit, le 04/05/2007 17:15 :
D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors qu e
ApiViewer2004 (chargé il y a quelques semaines) la déclare comme un e
Sub, donc sauf truc qui me serait passé au-dessus, sous VB, sans vale ur
de retour.
C'est quoi, que j'ai loupé ?




Au fait, ça, c'est les effets de bord habituels ?
Jean-marc
Le #15409241
Gloops wrote:
Gloops a écrit, le 04/05/2007 17:15 :
D'ailleurs, ici
http://msdn2.microsoft.com/en-us/library/aa384342.aspx
on me parle d'une valeur de retour de InternetCanonicalizeUrl, alors
que ApiViewer2004 (chargé il y a quelques semaines) la déclare comme
une Sub, donc sauf truc qui me serait passé au-dessus, sous VB, sans
valeur de retour.
C'est quoi, que j'ai loupé ?




Au fait, ça, c'est les effets de bord habituels ?



En fait il y a une confusion; La fonction telle qu'elle existe dans
wininet.dll est bien toujours une fonction, qui retourne un Booléen.

Mais rien n'interdit de la déclarer en VB comme une Sub:

Ainsi, ceci est valide:

Private Declare Sub InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long)

En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.

En C on peut faire:

fichier truc.c
--------------
int toto(int a)
{
return 1;
}

fichier budule.c
----------------

void toto(int a);

toto(3);

Voila pour la technique.

Ceci dit l'api viewer se trompe. InternetCanonicalizeUrl est
bel et bien toujours une fonction, même si rien n'interdit de
la déclare en Sub.

Ouf, j'espère avoir été clair :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Gloops
Le #15409211
Jean-marc a écrit, le 04/05/2007 21:15 :
En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.




Bon, d'accord.
Alors si on veut la valeur de retour je suppose qu'on déclare comme ç a :

Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean
Jean-marc
Le #15409201
Gloops wrote:
Jean-marc a écrit, le 04/05/2007 21:15 :
En fait, ce faisant, on dit juste à VB qu'on veut négliger la
valeur de retour.
Ca vient du C en fait.




Bon, d'accord.
Alors si on veut la valeur de retour je suppose qu'on déclare comme
ça :
Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean



Presque :-)

En fait la dll de wininet est écrite en C. La fonction retourne un BOOL.
Mais en C, pas de booléen. LE BOOL est un type "windows", pas un type C.
En fait, dans les couches basses, voici la définition:

typedef int BOOL;

Au final, la fonction retourne donc un "int" du C.
Et en général, quand on récupère un "int" du C coté VB, on récupère tout
ça dans un long (VB). Voici donc:

Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Long

La fonction retourne (1) en cas de succès, et (0) en cas déchec.
A noter qu'en VB, True est représenté par -1, alors qu'en C, la
convention est que False est représenté par 0 et toute autre valeur que
zéro est True.

Donc si tu veux être un vrai puriste, il faut déclarer la fonction comme
indiquée plus haut, retournant un Long et pour l'usage tu peux faire comme
ça:

Dim ret As Long
Dim bRet As Boolean

ret = InternetCanonicalizeUrl(strTemp, strBuff, 255, ICU_DECODE Or
ICU_NO_ENCODE)

bRet = CBool(ret)
If bRet Then
' succès
Else
' echec
End If

Ca fonctionne bien car CBool(1) va retourner True et CBool(0) va retourner
False,
ce qui est le résultat attendu :-)

Ouf !!


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc
Le #15409191
Jean-marc wrote:
Gloops wrote:



Alors si on veut la valeur de retour je suppose qu'on déclare comme
ça :
Private Declare Function InternetCanonicalizeUrl Lib "wininet.dll" _
Alias "InternetCanonicalizeUrlA" ( _
ByVal lpszUrl As String, _
ByVal lpszBuffer As String, _
ByRef lpdwBufferLength As Long, _
ByVal dwFlags As Long) As Boolean





En fait, si tu déclares comme ça ça marche aussi car VB va
se débrouiller pour faire la promotion (le casting) correct
dans le type booléen de VB.

Mais j'aime meiux (affaire de goût) garder les déclarations
avec les vrais types, et faire le casting "à la main" !

Bref ...

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
parci
Le #15409161
On Fri, 04 May 2007 20:50:42 +0200, Gloops wrote:

J'ai l'impression qu'il doit y avoir de quoi faire pour quelqu'un qui
voudrait présenter des exemples de cette API. Quelqu'un s'y serait-il
frotté ?



J'utilise plutôt les fonctions de Shlwapi.dll qui permettent le même
genre de chose :

http://vbnet.mvps.org/index.html?code/internet/urlcanonicalize.htm
http://vbnet.mvps.org/index.html?code/internet/urlescape.htm
http://vbnet.mvps.org/index.html?code/internet/urlcreatefrompath.htm
http://vbnet.mvps.org/index.html?code/internet/urlgetpart.htm
Publicité
Poster une réponse
Anonyme