Aracılığıyla paylaş


Karakter kümesi belirtme

Alan, DllImportAttribute.CharSet dize hazırlamayı denetler ve platform çağrısının DLL'deki işlev adlarını nasıl bulduğunu belirler. Bu konuda her iki davranış da açıklanmaktadır.

Bazı API'ler, dize bağımsız değişkenlerini alan işlevlerin iki sürümünü dışarı aktarır: dar (ANSI) ve geniş (Unicode). Örneğin Windows API'sinde işlev için MessageBox aşağıdaki giriş noktası adları bulunur:

  • MessageBoxA

    Giriş noktası adının sonuna eklenen "A" ile ayırt edilen 1 baytlık ANSI biçimlendirmesi sağlar. MessageBoxA 'ye yapılan çağrılar her zaman dizeleri ANSI formatında dönüştürür.

  • MessageBoxW

    Giriş noktası adının sonuna eklenen "W" ile ayırt edilen 2 baytlık unicode biçimlendirme sağlar. MessageBoxW çağrıları dizeleri her zaman Unicode biçiminde dönüştürür.

Dize Sıralama ve Ad Eşleştirme

alanı CharSet aşağıdaki değerleri kabul eder:

Ansi (varsayılan değer)

  • Dize düzenleme

    Platform çağırma, dizeleri yönetilen formatlarından (Unicode) ANSI formatına aktarıyor.

  • Ad eşleştirme

    DllImportAttribute.ExactSpelling alanı true varsayılan olarak Visual Basic'te olduğu gibi olduğunda, platform çağırma yalnızca belirttiğiniz adı arar. Örneğin, MessageBox belirttiğinizde, platform çağrısı tam doğru yazımı bulamadığında MessageBox araması yapılır ve başarısız olur.

    ExactSpelling alanı false, C++ ve C# dillerinde varsayılan olarak olduğu gibi olduğunda, platform çağrısı önce karıştırılmamış diğer adı (MessageBox), ardından karıştırılmamış diğer ad bulunamazsa karıştırılmış adı (MessageBoxA) arar. ANSI ad eşleştirme davranışının Unicode ad eşleştirme davranışından farklı olduğuna dikkat edin.

Unicode

  • Dize düzenleme

    Platform çağrısı, dizeleri yönetilen biçimlerinden (Unicode) Unicode biçimine dönüştürerek kopyalar.

  • Ad eşleştirme

    ExactSpelling alanı true varsayılan olarak Visual Basic'te olduğu gibi olduğunda, platform çağırma yalnızca belirttiğiniz adı arar. Örneğin, MessageBox belirttiğinizde, platform çağrısı MessageBox arar ve tam doğru yazımı bulamazsa başarısız olur.

    Alan ExactSpelling, C++ ve C# dilinde varsayılan olarak olduğu gibi olduğunda, platform çağrısı önce karışık adı (false) arar; karışık adı bulunamazsa, karışık olmayan takma adını (MessageBox) arar. Unicode ad eşleştirme davranışının ANSI ad eşleştirme davranışından farklı olduğuna dikkat edin.

Auto

  • Platform çağrısı, hedef platforma göre çalışma zamanında ANSI ve Unicode biçimleri arasında seçim yapılır.

Visual Basic'te karakter kümesi belirtme

Visual Basic'te, bildirim deyimine , Ansiveya Unicode anahtar sözcüğünü Autoekleyerek karakter kümesi davranışını belirtebilirsiniz. Karakter kümesi anahtar sözcüğünü atlarsanız, DllImportAttribute.CharSet alan varsayılan olarak ANSI karakter kümesine ayarlanır.

Aşağıdaki örnek, MessageBox işlevini farklı karakter kümesi davranışlarına sahip üç kez tanımlar. İlk deyim karakter kümesi anahtar sözcüğünü atlar, bu nedenle karakter kümesi varsayılan olarak ANSI olur. İkinci ve üçüncü deyimler, anahtar sözcük içeren bir karakter kümesini açıkça belirtir.

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

C# ve C++ içinde bir karakter kümesi belirtme

alanı, DllImportAttribute.CharSet temel alınan karakter kümesini ANSI veya Unicode olarak tanımlar. Karakter kümesi, bir yöntem için dize bağımsız değişkenlerinin nasıl aktarılması gerektiğini denetler. Karakter kümesini belirtmek için aşağıdaki formlardan birini kullanın:

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

Aşağıdaki örnek, bir karakter kümesi belirtmek için öznitelik eklenen MessageBox işlevin üç tane yönetilen tanımını gösterir. İlk tanımda, CharSet alanı atlandığında varsayılan olarak ANSI karakter kümesine ayarlanır.

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

Ayrıca bakınız