Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
MessageBoxAGiriş 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.MessageBoxWGiriş 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ı
truevarsayı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ığındaMessageBoxaraması yapılır ve başarısız olur.ExactSpellingalanı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.
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
ExactSpellingalanıtruevarsayı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ıMessageBoxarar 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.
- 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);