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


Задание точки входа

Точка входа определяет расположение функции в библиотеке DLL. В управляемом проекте исходное имя или порядковый номер точки входа целевой функции определяет эту функцию в границах взаимодействия. Вы можете сопоставить точку входа с другим именем, чтобы фактически переименовать функцию.

Ниже перечислены возможные причины переименования функции DLL.

  • чтобы избежать использования имен функций API, в которых учитывается регистр символов;

  • чтобы привести имена в соответствие с существующими стандартами именования;

  • чтобы сделать возможным вызов функций, принимающих данные разных типов (путем объявления нескольких версий одной и той же функции DLL);

  • чтобы упростить применение интерфейсов API, которые содержат версии функции для ANSI и Юникода.

В этом разделе показано, как переименовать функцию DLL в управляемом коде.

Переименование функции в Visual Basic

В Visual Basic для установки поля DllImportAttribute.EntryPoint используется ключевое слово Function в операторе Declare. В приведенном ниже примере показан базовый вариант объявления.

Friend Class NativeMethods
    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

Как показано в следующем примере, можно заменить точку входа MessageBox на MsgBox, включив в определение ключевое слово Alias. В обоих примерах ключевое слово Auto позволяет не указывать версию кодировки для точки входа. Дополнительные сведения о выборе кодировки см. в разделе Определение кодировки.

Friend Class NativeMethods
    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
End Class

Переименование функции в C# и C++

Для задания функции DLL по имени или порядковому номеру можно использовать поле DllImportAttribute.EntryPoint. Если имя функции в определении метода совпадает с именем точки входа в библиотеке DLL, явно задавать функцию с помощью поля EntryPoint не требуется. В противном случае, чтобы указать имя или порядковый номер, следует использовать одну из следующих форм атрибута:

[DllImport("DllName", EntryPoint = "Functionname")]
[DllImport("DllName", EntryPoint = "#123")]

Обратите внимание, что порядковому номеру должен предшествовать знак #.

В приведенном ниже примере показан способ замены в коде MessageBoxA на MsgBox с помощью поля EntryPoint.

using System;
using System.Runtime.InteropServices;

internal static class NativeMethods
{
    [DllImport("user32.dll", EntryPoint = "MessageBoxA")]
    internal static extern int MsgBox(
        IntPtr hWnd, string lpText, string lpCaption, uint uType);
}
using namespace System;
using namespace System::Runtime::InteropServices;

typedef void* HWND;
[DllImport("user32", EntryPoint = "MessageBoxA")]
extern "C" int MsgBox(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

См. также