Sdílet prostřednictvím


Zadání znakové sady

Pole DllImportAttribute.CharSet řídí maršálování řetězců a určuje, jak platformové vyvolání vyhledává názvy funkcí v knihovně DLL. Toto téma popisuje obě chování.

Některá rozhraní API exportují dvě verze funkcí, které přebírají řetězcové argumenty: úzké (ANSI) a široké (Unicode). Rozhraní API systému Windows například obsahuje následující názvy vstupních bodů pro MessageBox funkci:

  • MessageBoxA

    Poskytuje formátování 1 bajtového znaku ANSI, které je odlišeno "A" připojeným k názvu vstupního bodu. Volání funkce MessageBoxA vždy zařazují řetězce ve formátu ANSI.

  • MessageBoxW

    Poskytuje 2 bajtové formátování Unicode, odlišené znakem "W" připojeným k názvu vstupního bodu. Volání na MessageBoxW vždy zpracovává řetězce ve formátu Unicode.

Marshallování řetězců a porovnávání jmen

Pole CharSet přijímá následující hodnoty:

Ansi (výchozí hodnota)

  • Zařazování řetězců

    Platforma přetváří řetězce z jejich spravovaného formátu (Unicode) do formátu ANSI.

  • Srovnávání názvů

    Když je pole DllImportAttribute.ExactSpelling ve výchozím nastavení v jazyce Visual Basic true, platforma vyvolá vyhledávání pouze pro zadaný název. Pokud například zadáte MessageBox, platforma se pokusí vyhledat výraz MessageBox, ale selže, pokud nenajde přesnou shodu se správným pravopisem.

    ExactSpelling Pokud je falsepole ve výchozím nastavení v jazyce C++ a C#, platforma vyvolá vyhledávání neanganglovaného aliasu (MessageBox), pak mangled name (MessageBoxA), pokud se nenašel nechráněný alias. Všimněte si, že chování porovnávání názvů ANSI se liší od chování při porovnávání názvů Unicode.

Unicode

  • Zařazování řetězců

    Platforma zkopíruje řetězce ze spravovaného formátu (Unicode) do formátu Unicode.

  • Srovnávání názvů

    Když je pole ExactSpelling ve výchozím nastavení v jazyce Visual Basic true, platforma vyvolá vyhledávání pouze pro zadaný název. Pokud například zadáte MessageBox, platforma provede vyhledávání MessageBox a selže, pokud nemůže najít přesný pravopis.

    Když je pole ExactSpellingfalse ve výchozím nastavení v jazyce C++ a C#, platforma nejprve provádí vyhledání manglovaného názvu (MessageBoxW), a pokud se manglovaný název nenajde, hledá nemanglovaný alias (MessageBox). Všimněte si, že chování porovnávání názvů Unicode se liší od chování při porovnávání názvů ANSI.

Auto

  • Platforma vyvolá výběr mezi formáty ANSI a Unicode za běhu na základě cílové platformy.

Zadejte znakovou sadu v Visual Basicu

Chování znakové sady v jazyce Visual Basic můžete určit přidáním AnsiUnicode, nebo Auto klíčového slova do příkazu deklarace. Pokud vynecháte klíčové slovo znakové sady, pole DllImportAttribute.CharSet se automaticky nastaví na znakovou sadu ANSI.

Následující příklad deklaruje MessageBox funkci třikrát, pokaždé s jiným chováním znakové sady. První příkaz vynechá klíčové slovo znakové sady, takže znaková sada se ve výchozím nastavení nastaví na ANSI. Druhé a třetí příkazy explicitně určují znakovou sadu s klíčovým slovem.

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

Zadání znakové sady v jazyce C# a C++

Pole DllImportAttribute.CharSet identifikuje podkladovou znakovou sadu jako ANSI nebo Unicode. Znaková sada určuje, jak mají být argumenty řetězce předávány metodě. K označení znakové sady použijte jeden z následujících formulářů:

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

Následující příklad ukazuje tři spravované definice MessageBox funkce přiřazené k určení znakové sady. V první definici, při vynechání, se CharSet pole nastaví ve výchozím režimu na znakovou sadu 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);

Viz také