Megosztás a következőn keresztül:


Karakterkészlet megadása

A DllImportAttribute.CharSet mező szabályozza a sztringek rendezését, és meghatározza, hogy a platformhívás hogyan találja meg a függvényneveket egy DLL-ben. Ez a témakör mindkét viselkedést ismerteti.

Egyes API-k sztringargumentumokat tartalmazó függvények két verzióját exportálják: keskeny (ANSI) és széles (Unicode). A Windows API például a következő belépésipont-neveket tartalmazza a MessageBox függvényhez:

  • MessageBoxA

    1 bájtos ANSI-formázást biztosít, amelyet a belépési pont nevéhez hozzáfűzött "A" különböztet meg. A MessageBoxA hívásai mindig ANSI formátumú, marshal által feldolgozott sztringeket használnak.

  • MessageBoxW

    2 bájtos Unicode-formázást biztosít, amelyet a belépési pont nevéhez fűzött "W" karakter különböztet meg. A MessageBoxW hívásai mindig Unicode formátumú marshal sztringeket használnak.

Karakterlánc-rendezés és névegyeztetés

A CharSet mező a következő értékeket fogadja el:

Ansi (alapértelmezett érték)

  • Sztringek rendezése

    A platform hívása átalakítja a karakterláncokat a kezelt formátumból (Unicode) ANSI formátumba.

  • Névösszehasonlítás

    Ha a DllImportAttribute.ExactSpelling mező true, ami a Visual Basicben az alapértelmezés, akkor a platform meghívása csak a megadott névre keres. Ha például a MessageBoxot adja meg, a platform meghívja a MessageBox kereséseit, és sikertelen lesz, ha nem találja a pontos helyesírást.

    Ha a ExactSpelling mező false, alapértelmezés szerint a C++ és C# esetén először a platform a nem módosított aliasra (MessageBox), majd a módosított névre (MessageBoxA) keres, ha a nem módosított alias nem található. Figyelje meg, hogy az ANSI névegyeztetési viselkedése eltér a Unicode névegyeztetési viselkedésétől.

Unicode

  • Sztringek rendezése

    A platformhívások sztringeket másolnak a felügyelt formátumukból (Unicode) Unicode formátumba.

  • Névösszehasonlítás

    Ha a ExactSpelling mező true, ami a Visual Basicben az alapértelmezés, akkor a platform meghívása csak a megadott névre keres. Ha például a MessageBoxot adja meg, a platform meghívja a MessageBox kereséseit, és sikertelen lesz, ha nem találja a pontos helyesírást.

    Ha a ExactSpelling mező false, ami a C++ és C# esetében alapértelmezés szerint így van, a platformelőhívás először a torzított névre (MessageBoxW) keres, majd a kódolatlan aliasra (MessageBox), ha a torzított név nem található. Figyelje meg, hogy a Unicode névegyeztetési viselkedése eltér az ANSI névegyeztetési viselkedésétől.

Auto

  • A platformhívás futásidőben választ az ANSI és a Unicode formátumok között a célplatform alapján.

Karakterkészlet megadása a Visual Basicben

A Karakterkészlet viselkedését a Visual Basicben úgy adhatja meg, hogy hozzáadja az Ansi, Unicodevagy Auto kulcsszót a deklarációs utasításhoz. Ha kihagyja a karakterkészlet kulcsszót, a DllImportAttribute.CharSet mező alapértelmezés szerint az ANSI karakterkészletre lesz beállítva.

Az alábbi példa háromszor deklarálja a MessageBox függvényt, minden alkalommal más karakterkészlettel. Az első utasítás kihagyja a karakterkészlet kulcsszót, így a karakterkészlet alapértelmezés szerint ANSI lesz. A második és a harmadik utasítás kifejezetten egy kulcsszóval rendelkező karakterkészletet határoz meg.

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

Karakterkészlet megadása C# és C++ nyelven

A DllImportAttribute.CharSet mező ANSI-ként vagy Unicode-ként azonosítja a mögöttes karakterkészletet. A karakterkészlet vezérli, hogy a metódusok sztringargumentumait hogyan kell rendezni. A következő űrlapok egyikével jelezheti a karakterkészletet:

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

Az alábbi példa a MessageBox függvény három felügyelt definícióját mutatja be egy karakterkészlet megadásához. Az első definícióban, kihagyása esetén, a CharSet mező alapértelmezetten az ANSI karakterkészletet használja.

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

Lásd még