Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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.
- 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
, Unicode
vagy 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);