Delen via


Een tekenset opgeven

Het DllImportAttribute.CharSet veld bepaalt het marshallen van tekenreeksen en bepaalt hoe met platform functienamen in een DLL worden gevonden. In dit onderwerp worden beide gedragingen beschreven.

Sommige API's exporteren twee versies van functies die tekenreeksargumenten aannemen: smal (ANSI) en breed (Unicode). De Windows-API bevat bijvoorbeeld de volgende invoerpuntnamen voor de functie MessageBox :

  • MessageBoxA

    Biedt ANSI-opmaak van 1 byteteken, die wordt onderscheiden door een 'A' die is toegevoegd aan de naam van het invoerpunt. Aanroepen naar MessageBoxA altijd marshal tekenreeksen in ANSI-indeling.

  • MessageBoxW

    Biedt Unicode-opmaak van 2 bytes, die wordt onderscheiden door een 'W' die is toegevoegd aan de naam van het invoerpunt. Aanroepen naar MessageBoxW altijd marshal tekenreeksen in Unicode-indeling.

Tekenreeks marshalling en naamkoppeling

Het CharSet veld accepteert de volgende waarden:

Ansi (standaardwaarde)

  • Tekenreeks marshalling

    Platform roept marshals-tekenreeksen aan vanuit hun beheerde indeling (Unicode) naar ANSI-indeling.

  • Naamkoppeling

    Wanneer het DllImportAttribute.ExactSpelling veld standaard trueis ingesteld in Visual Basic, wordt alleen door het platform gezocht naar de naam die u opgeeft. Als u bijvoorbeeld MessageBox opgeeft, roept het platform zoekopdrachten voor MessageBox aan en mislukt het wanneer de exacte spelling niet kan worden gevonden.

    Als het ExactSpelling veld standaard in C++ en C# is false, zoekt het platform eerst naar de onbeheerde alias (MessageBox), dan wordt de naam van de mangled (MessageBoxA) aangeroepen als de niet-beheerde alias niet wordt gevonden. U ziet dat ansi-naamkoppelingsgedrag verschilt van unicode-naamkoppelingsgedrag.

Unicode

  • Tekenreeks marshalling

    Platform roept tekenreeksen aan van hun beheerde indeling (Unicode) naar Unicode-indeling.

  • Naamkoppeling

    Wanneer het ExactSpelling veld standaard trueis ingesteld in Visual Basic, wordt alleen door het platform gezocht naar de naam die u opgeeft. Als u bijvoorbeeld MessageBox opgeeft, roept het platform zoekopdrachten voor MessageBox aan en mislukt het als de exacte spelling niet kan worden gevonden.

    Wanneer het ExactSpelling veld is false, zoals standaard in C++ en C#, zoekt het platform eerst naar de naam van de mangled (MessageBoxW), dan de onbeheerde alias (MessageBox) als de naam van de mangled niet wordt gevonden. U ziet dat het unicode-naamkoppelingsgedrag verschilt van het ansi-naamkoppelingsgedrag.

Auto

  • Platformaanroepen kiezen tussen ANSI- en Unicode-indelingen tijdens runtime, op basis van het doelplatform.

Een tekenset opgeven in Visual Basic

U kunt het gedrag van tekenset opgeven in Visual Basic door het Ansi, Unicodeof Auto trefwoord toe te voegen aan de declaratie-instructie. Als u het trefwoord voor tekenset weglaat, wordt het DllImportAttribute.CharSet veld standaard ingesteld op de ANSI-tekenset.

In het volgende voorbeeld wordt de functie MessageBox drie keer gedeclareert, telkens met verschillende tekensetgedrag. Met de eerste instructie wordt het trefwoord voor tekenset weggelaten, dus de tekenset wordt standaard ingesteld op ANSI. De tweede en derde instructies geven expliciet een tekenset op met een trefwoord.

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

Een tekenset opgeven in C# en C++

Het DllImportAttribute.CharSet veld identificeert de onderliggende tekenset als ANSI of Unicode. De tekenset bepaalt hoe tekenreeksargumenten voor een methode moeten worden ge marshalld. Gebruik een van de volgende formulieren om de tekenset aan te geven:

[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)]

In het volgende voorbeeld ziet u drie beheerde definities van de functie MessageBox die is toegewezen om een tekenset op te geven. In de eerste definitie, door het weglaten ervan, wordt het CharSet veld standaard ingesteld op de ANSI-tekenset.

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

Zie ook