Поделиться через


Пример 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