Bagikan melalui


Tentukan set karakter

Bidang DllImportAttribute.CharSet mengontrol marshalling string dan menentukan bagaimana pemanggilan platform menemukan nama-nama fungsi dalam DLL. Topik ini menjelaskan kedua perilaku tersebut.

Beberapa API mengekspor dua versi fungsi yang mengambil argumen string: sempit (ANSI) dan wide (Unicode). API Windows, misalnya, menyertakan nama titik masuk berikut untuk fungsi:MessageBox

  • MessageBoxA

    Menyediakan pemformatan karakter ANSI 1-byte, ditandai oleh "A" yang ditambahkan ke nama titik masuk. Panggilan ke MessageBoxA selalu memproses string dalam format ANSI.

  • MessageBoxW

    Menyediakan pemformatan Unicode karakter 2 byte, dibedakan oleh "W" yang ditambahkan ke nama titik masuk. Pemanggilan ke MessageBoxW selalu memarselkan string dalam format Unicode.

String Marshalling dan Pencocokan Nama

Bidang CharSet menerima nilai berikut:

Ansi (nilai default)

  • Pengolahan string

    Platform memanggil string marshal dari format terkelola mereka (Unicode) ke format ANSI.

  • Pencocokan nama

    DllImportAttribute.ExactSpelling Ketika bidang adalah true, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarian MessageBox dan gagal ketika tidak dapat menemukan ejaan yang tepat.

    Ketika bidang ExactSpelling adalah false, sebagaimana secara default di C++ dan C#, platform melakukan pencarian untuk alias yang belum dimodifikasi terlebih dahulu (MessageBox), kemudian nama teracak (MessageBoxA) jika alias yang belum dimodifikasi tidak ditemukan. Perhatikan bahwa perilaku pencocokan nama ANSI berbeda dari perilaku pencocokan nama Unicode.

Unicode

  • Pengolahan string

    Platform memanggil salinan string dari format terkelolanya (Unicode) ke format Unicode.

  • Pencocokan nama

    ExactSpelling Ketika bidang adalah true, seperti secara default di Visual Basic, platform memanggil pencarian hanya untuk nama yang Anda tentukan. Misalnya, jika Anda menentukan MessageBox, platform memanggil pencarian MessageBox dan gagal jika tidak dapat menemukan ejaan yang tepat.

    Ketika ExactSpelling bidang adalah false, seperti secara default di C++ dan C#, platform terlebih dahulu mencari nama yang diacak (MessageBoxW), kemudian jika nama yang diacak tidak ditemukan, pencarian beralih ke alias tidak diacak (MessageBox). Perhatikan bahwa perilaku pencocokan nama Unicode berbeda dari perilaku pencocokan nama ANSI.

Auto

  • Pemanggilan platform memilih antara format ANSI dan Unicode saat runtime, berdasarkan platform target.

Tentukan set karakter di Visual Basic

Anda dapat menentukan perilaku set karakter di Visual Basic dengan menambahkan Ansikata kunci , , Unicodeatau Auto ke pernyataan deklarasi. Jika Anda menghilangkan kata kunci set karakter, DllImportAttribute.CharSet bidang akan default ke kumpulan karakter ANSI.

Contoh berikut mendeklarasikan MessageBox fungsi tiga kali, setiap kali dengan perilaku set karakter yang berbeda. Pernyataan pertama mengabaikan kata kunci karakter set, sehingga karakter set default ke ANSI. Pernyataan kedua dan ketiga secara eksplisit menentukan kumpulan karakter dengan kata kunci.

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

Tentukan set karakter di C# dan C++

Bidang DllImportAttribute.CharSet mengidentifikasi kumpulan karakter yang mendasar sebagai ANSI atau Unicode. Set karakter mengontrol cara argumen string harus diubah saat diteruskan ke metode. Gunakan salah satu formulir berikut untuk menunjukkan kumpulan karakter:

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

Contoh berikut menunjukkan tiga definisi dikelola dari fungsi MessageBox yang diatributkan untuk menentukan kumpulan karakter. Dalam definisi pertama, karena penghapusannya, CharSet bidang secara default mengatur ke set karakter 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);

Lihat juga