Пример MsgBox
В этом примере показывается, как передавать строковые типы по значению в качестве параметров In и когда использовать поля EntryPoint, CharSet и ExactSpelling.
В примере MsgBox используются следующая неуправляемая функция, показанная со своим исходным объявлением.
Функция MessageBox, экспортированная из User32.dll.
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
В данном примере класс LibWrap содержит управляемый прототип для каждой неуправляемой функции, вызываемой классом MsgBoxSample. Для одной и той же неуправляемой функции методы управляемых прототипов MsgBox, MsgBox2 и MsgBox3 объявляются по-разному
Объявление метода MsgBox2 приводит к неверным результатам в поле сообщения, поскольку заданный тип символов (ANSI) не совпадает с входной точкой MessageBoxW, которая является именем функции Юникода. Объявление для MsgBox3 приводит к несоответствию полей EntryPoint, CharSet и ExactSpelling. Вызов метода MsgBox3 создает исключение. Подробные сведения об именовании строк и маршалинге имен см. в разделе Задание кодировки.
Объявление прототипов
Public Class LibWrap
' Declares managed prototypes for unmanaged functions.
Declare Auto Function MsgBox Lib "User32.dll" Alias "MessageBox" ( _
ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, _
ByVal typ As Integer ) As Integer
' Causes incorrect output in the message window.
Declare Ansi Function MsgBox2 Lib "User32.dll" Alias "MessageBoxW" ( _
ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, _
ByVal type As Integer ) As Integer
' Causes an exception to be thrown.
' ExactSpelling is True by default in when
' Ansi or Unicode is used.
Declare Ansi Function MsgBox3 Lib "User32.dll" Alias "MessageBox" ( _
ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, _
ByVal typ As Integer ) As Integer
End Class
public class LibWrap
{
// Declares managed prototypes for unmanaged functions.
[DllImport( "User32.dll", EntryPoint="MessageBox",
CharSet=CharSet.Auto)]
public static extern int MsgBox(int hWnd, string text, string caption,
uint type);
// Causes incorrect output in the message window.
[DllImport( "User32.dll", EntryPoint="MessageBoxW",
CharSet=CharSet.Ansi )]
public static extern int MsgBox2(int hWnd, string text,
string caption, uint type);
// Causes an exception to be thrown. EntryPoint, CharSet, and
// ExactSpelling fields are mismatched.
[DllImport( "User32.dll", EntryPoint="MessageBox",
CharSet=CharSet.Ansi, ExactSpelling=true )]
public static extern int MsgBox3(int hWnd, string text,
string caption, uint type);
}
public ref class LibWrap
{
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);
};
Вызов функций
Public Class MsgBoxSample
Public Shared Sub Main()
LibWrap.MsgBox(0, "Correct text", "MsgBox Sample", 0)
LibWrap.MsgBox2(0, "Incorrect text", "MsgBox Sample", 0)
Try
LibWrap.MsgBox3(0, "No such function", "MsgBox Sample", 0)
Catch e As EntryPointNotFoundException
Console.WriteLine("EntryPointNotFoundException thrown as expected!")
End Try
End Sub
End Class
public class MsgBoxSample
{
public static void Main()
{
LibWrap.MsgBox(0, "Correct text", "MsgBox Sample", 0);
LibWrap.MsgBox2(0, "Incorrect text", "MsgBox Sample", 0);
try
{
LibWrap.MsgBox3(0, "No such function", "MsgBox Sample", 0);
}
catch(EntryPointNotFoundException)
{
Console.WriteLine("EntryPointNotFoundException thrown as expected!");
}
}
}
public class MsgBoxSample
{
public:
static void Main()
{
LibWrap::MsgBox(0, "Correct text", "MsgBox Sample", 0);
LibWrap::MsgBox2(0, "Incorrect text", "MsgBox Sample", 0);
try
{
LibWrap::MsgBox3(0, "No such function", "MsgBox Sample", 0);
}
catch (EntryPointNotFoundException^)
{
Console::WriteLine("EntryPointNotFoundException thrown as expected!");
}
}
};
См. также
Основные понятия
Типы данных вызовов неуправляемого кода
Маршалинг по умолчанию для строк
Создание прототипов в управляемом коде
Другие ресурсы
Specifying a Character Set