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


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

Точка входа определяет расположение функции в библиотеке 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);

См. также