Sdílet prostřednictvím


Zadání znakové sady

Pole DllImportAttribute.CharSet řídí zařazování řetězců a určuje, jak platforma vyvolá 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 funkci MessageBox :

  • 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í 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í messageBoxW vždy zařazování řetězců ve formátu Unicode.

Zařazování řetězců a porovnávání názvů

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

Ansi (výchozí hodnota)

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

    Platforma volá řetězce zařazování z jejich spravovaného formátu (Unicode) do formátu ANSI.

  • Párování názvů

    DllImportAttribute.ExactSpelling Pokud je truepole ve výchozím nastavení v jazyce Visual Basic, platforma vyvolá vyhledávání pouze pro zadaný název. Pokud například zadáte MessageBox, platforma vyvolá hledání MessageBox a selže, když nemůže najít přesnou kontrolu pravopisu.

    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 vyvolá řetězce ze spravovaného formátu (Unicode) do formátu Unicode.

  • Párování názvů

    ExactSpelling Pokud je truepole ve výchozím nastavení v jazyce Visual Basic, platforma vyvolá vyhledávání pouze pro zadaný název. Pokud například zadáte MessageBox, platforma vyvolá hledání MessageBox a selže, pokud nemůže najít přesnou kontrolu pravopisu.

    ExactSpelling Pokud je falsepole ve výchozím nastavení v jazyce C++ a C#, platforma vyvolá vyhledávání mangled name first (MessageBoxW), pak nespravovaný alias (MessageBox), pokud se název mangled nenalezl. 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.

Zadání znakové sady v jazyce Visual Basic

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, DllImportAttribute.CharSet pole se ve výchozím nastavení nastaví na znakovou sadu ANSI.

Následující příklad deklaruje funkci MessageBox 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 řídí, jak mají být argumenty řetězce metody zařazovány. 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 funkce MessageBox přiřazené k určení znakové sady. V první definici CharSet se ve výchozím nastavení pole nastaví 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é