Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato ukázka ukazuje, jak předat typy řetězců podle hodnoty jako Parametry In a kdy použít EntryPoint, CharSeta ExactSpelling pole.
Ukázka MsgBox používá následující nespravovanou funkci zobrazenou s původní deklarací funkce:
MessageBoxexportováno z User32.dll.int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
V této ukázce NativeMethods třída obsahuje spravovaný prototyp pro každou nespravovanou funkci volanou MsgBoxSample třídou. Metody spravovaného prototypu MsgBoxa MsgBox2MsgBox3 mají různé deklarace pro stejnou nespravovanou funkci.
Deklarace pro MsgBox2 vygeneruje nesprávný výstup v poli zprávy, protože typ znaku zadaný jako ANSI se neshoduje s vstupním bodem MessageBoxW, což je název funkce Unicode. Deklarace pro MsgBox3 způsobuje nesoulad mezi poli EntryPoint, CharSet a ExactSpelling. Při zavolání MsgBox3 vyvolá výjimku. Podrobné informace o pojmenování řetězců a zařazování názvů naleznete v tématu Určení znakové sady.
Deklarování prototypů
private ref class NativeMethods
{
public:
// Declares managed prototypes for unmanaged functions.
[DllImport("User32.dll", EntryPoint = "MessageBox",
CharSet = CharSet::Auto)]
static int MsgBox(int hWnd, String^ text, String^ caption,
unsigned int type);
// Causes incorrect output in the message window.
[DllImport("User32.dll", EntryPoint = "MessageBoxW",
CharSet = CharSet::Ansi)]
static int MsgBox2(int hWnd, String^ text,
String^ caption, unsigned int type);
// Causes an exception to be thrown. EntryPoint, CharSet, and
// ExactSpelling fields are mismatched.
[DllImport("User32.dll", EntryPoint = "MessageBox",
CharSet = CharSet::Ansi, ExactSpelling = true)]
static int MsgBox3(int hWnd, String^ text,
String^ caption, unsigned int type);
};
internal static class NativeMethods
{
// Declares managed prototypes for unmanaged functions.
[DllImport("User32.dll", EntryPoint = "MessageBox",
CharSet = CharSet.Auto)]
internal static extern int MsgBox(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
// Causes incorrect output in the message window.
[DllImport("User32.dll", EntryPoint = "MessageBoxW",
CharSet = CharSet.Ansi)]
internal static extern int MsgBox2(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
// Causes an exception to be thrown. EntryPoint, CharSet, and
// ExactSpelling fields are mismatched.
[DllImport("User32.dll", EntryPoint = "MessageBox",
CharSet = CharSet.Ansi, ExactSpelling = true)]
internal static extern int MsgBox3(
IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
Friend Class NativeMethods
' Declares managed prototypes for unmanaged functions.
Friend Declare Auto Function MsgBox Lib "User32.dll" Alias "MessageBox" (
ByVal hWnd As IntPtr, ByVal lpText As String, ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
' Causes incorrect output in the message window.
Friend Declare Ansi Function MsgBox2 Lib "User32.dll" Alias "MessageBoxW" (
ByVal hWnd As IntPtr, ByVal lpText As String, ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
' Causes an exception to be thrown.
' ExactSpelling is True by default when Ansi or Unicode is used.
Friend Declare Ansi Function MsgBox3 Lib "User32.dll" Alias "MessageBox" (
ByVal hWnd As IntPtr, ByVal lpText As String, ByVal lpCaption As String,
ByVal uType As UInteger) As Integer
End Class
Volání funkcí
public class MsgBoxSample
{
public:
static void Main()
{
NativeMethods::MsgBox(0, "Correct text", "MsgBox Sample", 0);
NativeMethods::MsgBox2(0, "Incorrect text", "MsgBox Sample", 0);
try
{
NativeMethods::MsgBox3(0, "No such function", "MsgBox Sample", 0);
}
catch (EntryPointNotFoundException^)
{
Console::WriteLine("EntryPointNotFoundException thrown as expected!");
}
}
};
public class MsgBoxSample
{
public static void Main()
{
NativeMethods.MsgBox(0, "Correct text", "MsgBox Sample", 0);
NativeMethods.MsgBox2(0, "Incorrect text", "MsgBox Sample", 0);
try
{
NativeMethods.MsgBox3(0, "No such function", "MsgBox Sample", 0);
}
catch (EntryPointNotFoundException)
{
Console.WriteLine($"{nameof(EntryPointNotFoundException)} thrown as expected!");
}
}
}
Public Class MsgBoxSample
Public Shared Sub Main()
NativeMethods.MsgBox(0, "Correct text", "MsgBox Sample", 0)
NativeMethods.MsgBox2(0, "Incorrect text", "MsgBox Sample", 0)
Try
NativeMethods.MsgBox3(0, "No such function", "MsgBox Sample", 0)
Catch e As EntryPointNotFoundException
Console.WriteLine($"{NameOf(EntryPointNotFoundException)} thrown as expected!")
End Try
End Sub
End Class