Pour transf=E9rer une URL de type mailto: =E0 un autre logiciel, j'ai bes=
oin=20
de convertir une URL "sans espaces", style "subject:D%E9veloppeur%20VB", =
en cha=EEne de caract=E8res lisible, style "subject:D=E9veloppeur VB".
J'ai essay=E9 ceci :
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D
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 =3D &H10000000
Public Function DecodeURL(strURL As String) As String
Dim strTemp As String, strBuff As String
strTemp =3D strURL
strBuff =3D Space(256)
InternetCanonicalizeUrl strTemp, strBuff, 255, ICU_DECODE
DecodeURL =3D Left$(strBuff, InStr(strBuff, Chr$(0)) - 1)
End Function
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D
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=EAme la cha=EEne pour d=E9tecter le s=
igne=20
pourcent, et =E0 chaque fois que je l'aurai trouv=E9 je vais consid=E9rer=
les=20
deux caract=E8res suivants comme un nombre hexad=E9cimal dont il faudra=20
fournir le caract=E8re 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=E9 il y a quelques semaines) la d=E9clare comme une =
Sub, donc sauf truc qui me serait pass=E9 au-dessus, sous VB, sans valeur=
=20
de retour.
C'est quoi, que j'ai loup=E9 ?
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 :
-- Fred http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Dans : news:eXnLM8ljHHA.2216@TK2MSFTNGP06.phx.gbl,
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 :
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 :
-- Fred http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Jean-marc
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 :
Dans : news:eXnLM8ljHHA.2216@TK2MSFTNGP06.phx.gbl,
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 :
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 :
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 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é ?
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
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 :-)
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 :-)
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 :-)
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 ?
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é ?
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
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.
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.
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.
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 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
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
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 :-)
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 :-)
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 :-)
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" !
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" !
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" !