Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le champ DllImportAttribute.CharSet contrôle le marshaling des chaînes et détermine de quelle façon l’appel de code non managé recherche des noms de fonction dans une DLL. Cette rubrique décrit les deux comportements.
Certaines API exportent deux versions de fonctions qui prennent des arguments de chaîne : étroite (ANSI) et large (Unicode). L’API Windows, par exemple, inclut les noms de point d’entrée suivants pour la MessageBox fonction :
MessageBoxAFournit une mise en forme ANSI de 1 octets, distinguée par un « A » ajouté au nom du point d’entrée. Appels à
MessageBoxAmarshalise toujours des chaînes au format ANSI.MessageBoxWFournit une mise en forme Unicode de 2 octets, distinguée par un « W » ajouté au nom du point d’entrée. Appels à
MessageBoxWacheminent toujours les chaînes au format Unicode.
Marshaling de chaînes et correspondance de noms
Le CharSet champ accepte les valeurs suivantes :
Ansi (valeur par défaut)
Marshaling de chaînes
L’appel de code non managé marshale les chaînes de leur format managé (Unicode) au format ANSI.
Correspondance des noms
Lorsque le DllImportAttribute.ExactSpelling champ est
true, tel qu’il est par défaut dans Visual Basic, l’appel de plateforme recherche uniquement le nom que vous spécifiez. Par exemple, si vous spécifiez MessageBox, l’appel de plateforme rechercheMessageBoxet échoue lorsqu’il ne peut pas localiser l’orthographe exacte.Lorsque le
ExactSpellingchamp estfalse, tel qu’il est par défaut en C++ et en C#, l'appel de plateforme invoque d’abord l’alias non transformé (MessageBox), puis le nom transformé (MessageBoxA) si l’alias non transformé est introuvable. Notez que le comportement de correspondance de noms ANSI diffère du comportement de correspondance de noms Unicode.
Marshaling de chaînes
L’appel de code non managé copie les chaînes de leur format managé (Unicode) au format Unicode.
Correspondance des noms
Lorsque le
ExactSpellingchamp esttrue, tel qu’il est par défaut dans Visual Basic, l’appel de plateforme recherche uniquement le nom que vous spécifiez. Par exemple, si vous spécifiez MessageBox, l’appel de plateforme rechercheMessageBoxet échoue s’il ne peut pas localiser l’orthographe exacte.Lorsque le
ExactSpellingchamp estfalse, comme c'est le cas par défaut en C++ et en C#, l'appel de fonction plateforme recherche d'abord le nom mangé (MessageBoxW), puis l'alias non mangé (MessageBox) si le nom mangé est introuvable. Notez que le comportement de correspondance de noms Unicode diffère du comportement de correspondance de noms ANSI.
- L’appel de plateforme choisit entre les formats ANSI et Unicode au moment de l’exécution, en fonction de la plateforme cible.
Définir un jeu de caractères dans Visual Basic
Vous pouvez spécifier le comportement du jeu de caractères en Visual Basic en ajoutant les mots clés Ansi, Unicode, ou Auto à l'instruction de déclaration. Si vous omettez le mot-clé de jeu de caractères, le champ DllImportAttribute.CharSet utilise par défaut le jeu de caractères ANSI.
L’exemple suivant déclare la fonction MessageBox trois fois, chaque fois avec un comportement de jeu de caractères différent. La première instruction omet le mot clé character-set. Par conséquent, le jeu de caractères est défini par défaut sur ANSI. Les deuxième et troisième instructions spécifient explicitement un jeu de caractères avec un mot clé.
Friend Class NativeMethods
Friend Declare Function MessageBoxA Lib "user32.dll" (
ByVal hWnd As IntPtr,
ByVal lpText As String,
ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
Friend Declare Unicode Function MessageBoxW Lib "user32.dll" (
ByVal hWnd As IntPtr,
ByVal lpText As String,
ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
Friend Declare Auto Function MessageBox Lib "user32.dll" (
ByVal hWnd As IntPtr,
ByVal lpText As String,
ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
End Class
Spécifier un jeu de caractères en C# et C++
Le DllImportAttribute.CharSet champ identifie le jeu de caractères sous-jacent comme ANSI ou Unicode. Le jeu de caractères contrôle la manière dont les arguments de chaîne d’une méthode doivent être marshalés. Utilisez l’un des formulaires suivants pour indiquer le jeu de caractères :
[DllImport("DllName", CharSet = CharSet.Ansi)]
[DllImport("DllName", CharSet = CharSet.Unicode)]
[DllImport("DllName", CharSet = CharSet.Auto)]
[DllImport("DllName", CharSet = CharSet::Ansi)]
[DllImport("DllName", CharSet = CharSet::Unicode)]
[DllImport("DllName", CharSet = CharSet::Auto)]
L’exemple suivant montre trois définitions managées de la MessageBox fonction attribuée pour spécifier un jeu de caractères. Dans la première définition, par omission, le champ CharSet est réglé par défaut sur le jeu de caractères ANSI.
using System;
using System.Runtime.InteropServices;
internal static class NativeMethods
{
[DllImport("user32.dll")]
internal static extern int MessageBoxA(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
internal static extern int MessageBoxW(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int MessageBox(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
typedef void* HWND;
// Can use MessageBox or MessageBoxA.
[DllImport("user32")]
extern "C" int MessageBox(
HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);
// Can use MessageBox or MessageBoxW.
[DllImport("user32", CharSet = CharSet::Unicode)]
extern "C" int MessageBoxW(
HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);
// Must use MessageBox.
[DllImport("user32", CharSet = CharSet::Auto)]
extern "C" int MessageBox(
HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);