Задание точки входа
Точка входа определяет расположение функции в DLL. В управляемом проекте исходное имя или порядковый номер точки входа целевой функции определяет эту функцию в границах взаимодействия. Также разработчик может сопоставить точку входа с другим именем, фактически переименовывая функцию.
Ниже приведен перечень возможных причин переименования функции DLL:
избежать использования имен API-функций, чувствительных к регистру знаков;
привести имена в соответствие с существующими стандартами именования;
сделать возможным вызов функций, принимающих данные разных типов (объявляя несколько версий одной и той же функции DLL);
упростить применение API-интерфейсов, которые содержат функции версий для ANSI и Юникода.
В этом разделе показан способ переименования функции DLL в управляемом коде.
Переименование функции в Visual Basic
В Visual Basic для установки поля DllImportAttribute.EntryPoint используется ключевое слово Function в инструкции Declare. В следующем примере показан базовый вариант объявления.
Imports System.Runtime.InteropServices
Public Class Win32
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
End Class
Как показано в следующем примере, можно заменить точку входа MessageBox на MsgBox, включив в определение ключевое слово Alias. В обоих примерах ключевое слово Auto позволяет не указывать версию кодировки для точки входа. Дополнительные сведения о выборе кодировки см. в разделе Задание кодировки.
Imports System.Runtime.InteropServices
Public Class Win32
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
End Class
Переименование функции в C# и C++
Для задания функции по имени или порядковому номеру можно использовать поле DllImportAttribute.EntryPoint. Если имя функции в определении метода совпадает с именем точки входа в DLL, явно задавать функцию с помощью поля EntryPoint не требуется. В противном случае, чтобы указать имя или порядковый номер, следует использовать одну из следующих форм атрибута:
[DllImport("dllname", EntryPoint="Functionname")]
[DllImport("dllname", EntryPoint="#123")]
Обратите внимание, что порядковому номеру должен предшествовать знак #.
В следующем примере показан способ замены в программном коде MessageBoxA на MsgBox с помощью поля EntryPoint
using System.Runtime.InteropServices;
public class Win32 {
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
public static extern int MsgBox(int hWnd, String text, String caption,
uint type);
}
using namespace System::Runtime::InteropServices;
typedef void* HWND;
[DllImport("user32", EntryPoint="MessageBoxA")]
extern "C" int MsgBox(HWND hWnd,
String* pText,
String* pCaption,
unsigned int uType);
См. также
Ссылки
Основные понятия
Создание прототипов в управляемом коде
Примеры вызовов неуправляемого кода