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


Указание точки входа

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

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

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

  • Соответствие существующим стандартам именования

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

  • Упрощение использования API, содержащих версии ANSI и Юникода

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

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

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

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++

Вы можете использовать поле DllImportAttribute.EntryPoint для указания функции DLL по имени или порядковому номеру. Если имя функции в определении вашего метода совпадает с точкой входа в библиотеке 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);

См. также