1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
Option Explicit
' Procédures de manipulation de chaine désignée par un pointeur (voir à la fin de ce module)
Public Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long
'Détermine la longueur de la chaîne spécifiée (n'incluant pas le caractère nul final).
'Syntax
' int lstrlenW(
' LPCWSTR lpString
' );
'
'Parameters
' lpString Type: LPCTSTR Pointeur sur la chaîne UNICODE terminée par un zéro à vérifier.
'
'Return Value Type: int
' La fonction renvoie la longueur de la chaîne, en caractères.
' Si String est NULL, la fonction renvoie 0.
'
' Si unicode est UTF16, la chaine occupe nb caractères x 2 octets en mémoire plus le NULL.
Public Const CP_ACP = 0
Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codepage As Long, _
ByVal dwFlags As Long, _
lpWideCharStr As Any, _
ByVal cchWideChar As Long, _
lpMultiByteStr As Any, _
ByVal cchMultiByte As Long, _
ByVal lpDefaultChar As String, _
ByVal lpUsedDefaultChar As Long _
) As Long
' Mappe une chaîne UTF-16 (caractères larges) sur une nouvelle chaîne de caractères.
' La nouvelle chaîne de caractères n'est pas nécessairement dans un jeu de caractères
' multi-octets.
'
'https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-widechartomultibyte
'
'int WideCharToMultiByte(
' UINT CodePage,
' DWORD dwFlags,
' _In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr,
' int cchWideChar,
' LPSTR lpMultiByteStr,
' int cbMultiByte,
' LPCCH lpDefaultChar,
' LPBOOL lpUsedDefaultChar
');
' WideCharToMultiByte(page:CP_ACP, flag:0, pointeur:ByVal lpszW, taille:-1, tamponrecu:ByVal sRtn, taille:Len(sRtn), 0, 0)
' codepage : Page de code à utiliser pour effectuer la conversion.
' Ce paramètre peut être défini sur la valeur de toute page de code installée
' ou disponible dans le système d'exploitation.
' dwFlags : Drapeaux indiquant le type de conversion.
' L'application peut spécifier une combinaison des valeurs suivantes.
' La fonction est plus rapide si aucun de ces drapeaux nest défini.
' L'application doit spécifier WC_NO_BEST_FIT_CHARS et WC_COMPOSITECHECK avec
' la valeur spécifique WC_DEFAULTCHAR pour extraire tous les résultats de
' conversion possibles. Si les trois valeurs ne sont pas fournies, certains
' résultats seront manquants.
' lpWideCharStr : Pointeur sur la chaîne Unicode à convertir.
' cchWideChar : Taille, en caractères, de la chaîne indiquée par lpWideCharStr.
' Alternativement, ce paramètre peut être défini sur -1 si la chaîne est terminée
' par la valeur NULL. Si cchWideChar est défini sur 0, la fonction échoue.
' Si ce paramètre est égal à -1, la fonction traite la chaîne d'entrée entière,
' y compris le caractère nul final. Par conséquent, la chaîne de caractères
' résultante a un caractère nul final et la longueur renvoyée par la fonction
' inclut ce caractère.
' Si ce paramètre est défini sur un entier positif, la fonction traite
' exactement le nombre de caractères spécifié. Si la taille fournie n'inclut pas
' un caractère nul final, la chaîne de caractères résultante n'est pas terminée
' par un caractère nul et la longueur renvoyée n'inclut pas ce caractère.
' lpMultiByteStr : Pointeur sur un tampon qui reçoit la chaîne convertie.
' cchMultiByte : Taille, en octets, du tampon indiqué par lpMultiByteStr.
' Si ce paramètre est défini sur 0, la fonction retourne la taille de tampon
' requise pour lpMultiByteStr et n'utilise pas le paramètre de sortie lui-même.
' lpDefaultChar : Pointeur sur le caractère à utiliser si un caractère ne peut pas être
' représenté dans la page de code spécifiée.
' L'application définit ce paramètre sur NULL si la fonction doit utiliser
' une valeur par défaut du système.
' Pour obtenir le caractère par défaut du système, l'application peut appeler
' la fonction GetCPInfo ou GetCPInfoEx.
' Pour les paramètres CP_UTF7 et CP_UTF8 pour CodePage, ce paramètre doit être
' défini sur NULL.
' Sinon, la fonction échoue avec ERROR_INVALID_PARAMETER.
' lpUsedDefaultChar : Pointeur sur un drapeau qui indique si la fonction a utilisé un
' caractère par défaut lors de la conversion.
' Le drapeau est défini sur TRUE si un ou plusieurs caractères de la
' chaîne source ne peuvent pas être représentés dans la page de codes
' spécifiée.
' Sinon, le drapeau est défini sur FALSE. Ce paramètre peut être défini
' sur NULL.
' Pour les paramètres CP_UTF7 et CP_UTF8 pour CodePage, ce paramètre doit
' être défini sur NULL.
' Sinon, la fonction échoue avec ERROR_INVALID_PARAMETER.
'
'Return Value
' If successful, renvoie le nombre d'octets écrits dans le tampon pointé par lpMultiByteStr.
' Si la fonction réussit et que cbMultiByte a la valeur 0, la valeur de retour est la taille
' requise, en octets, pour le tampon indiqué par lpMultiByteStr.
' Reportez-vous également à dwFlags pour obtenir des informations sur la manière dont
' l'indicateur WC_ERR_INVALID_CHARS affecte la valeur de retour lorsque des séquences
' non valides sont entrées.
'La fonction renvoie 0 si elle ne réussit pas.
' Pour obtenir des informations d'erreur étendues, l'application peut appeler GetLastError,
' qui peut renvoyer l'un des codes d'erreur suivants:
' ERROR_INSUFFICIENT_BUFFER. La taille de la mémoire tampon fournie n'était pas assez grande
' ou elle était définie incorrectement sur NULL.
' ERROR_INVALID_FLAGS. Les valeurs fournies pour les indicateurs n'étaient pas valides.
' ERROR_INVALID_PARAMETER. Aucune des valeurs de paramètre n'était invalide.
' ERROR_NO_UNICODE_TRANSLATION. Unicode non valide a été trouvé dans une chaîne.
'
'Remarks
' Les pointeurs lpMultiByteStr et lpWideCharStr ne doivent pas être identiques.
' S'ils sont identiques, la fonction échoue et GetLastError renvoie ERROR_INVALID_PARAMETER.
' WideCharToMultiByte ne met pas à zéro une chaîne de sortie si la longueur de la chaîne
' d'entrée est explicitement spécifiée sans caractère nul de fin.
' Pour mettre fin à une chaîne de sortie pour cette fonction, l'application doit passer -1
' ou compter explicitement le caractère nul de fin pour la chaîne d'entrée.
' Si cbMultiByte est inférieur à cchWideChar, cette fonction écrit le nombre de caractères
' spécifié par cbMultiByte dans le tampon indiqué par lpMultiByteStr. Toutefois, si CodePage
' est défini sur CP_SYMBOL et que cbMultiByte est inférieur à cchWideChar, la fonction
' n'écrit aucun caractère dans lpMultiByteStr.
' Function StrPtr(Texte As String) As Long
' Cette fonction de VB est volontairement planquée par MS, pas de doc.
' Elle renvoie l'adresse mémoire de la chaine.
Public Function VBStringFromPtrW(ptrstrW As Long) As String
' Renvoie une chaîne ANSI d'un pointeur ptrstrW sur une chaîne Unicode
Dim strRtn As String
Dim Len_ptrstrW As Long
If ptrstrW = 0 Then
Stop
VBStringFromPtrW = ""
Exit Function
End If
Len_ptrstrW = lstrlenW(ByVal ptrstrW) ' Longueur de la chaîne associée au pointeur, exprimé en caractères
strRtn = String$(Len_ptrstrW * 2 + 1, 0) ' On réserve la mémoire pour accueillir le résultat (2 bytes/char)
' Demande à Kernel32 de faire la conversion et de donner le résultat dans strRtn
' WideCharToMultiByte retourne également la longueur de chaîne Unicode
Call WideCharToMultiByte(CP_ACP, 0, ByVal ptrstrW, -1, ByVal strRtn, Len(strRtn), 0, 0)
If InStr(strRtn, vbNullChar) Then
' On ne prends que ce qui est avant le NULL
VBStringFromPtrW = Left$(strRtn, InStr(strRtn, vbNullChar) - 1)
Else
' Si strRtn n'a pas de caractère null, la fonction Left$ ci-dessus renvoit une
' chaîne de longueur nulle ("").
VBStringFromPtrW = strRtn
End If
End Function |
Partager