Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
MessageBoxAPoskytuje 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
MessageBoxAvždy zařazují řetězce ve formátu ANSI.MessageBoxWPoskytuje 2 bajtové formátování Unicode, odlišené znakem "W" připojeným k názvu vstupního bodu. Volání na
MessageBoxWvž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ýrazMessageBox, ale selže, pokud nenajde přesnou shodu se správným pravopisem.ExactSpellingPokud jefalsepole 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.
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
ExactSpellingve výchozím nastavení v jazyce Visual Basictrue, platforma vyvolá vyhledávání pouze pro zadaný název. Pokud například zadáte MessageBox, platforma provede vyhledáváníMessageBoxa selže, pokud nemůže najít přesný pravopis.Když je pole
ExactSpellingfalseve 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.
- 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);