Udostępnij przez


Określanie punktu wejścia

Punkt wejścia identyfikuje lokalizację funkcji w bibliotece DLL. W ramach zarządzanego projektu oryginalna nazwa lub porządkowy punkt wejściowy docelowej funkcji identyfikuje tę funkcję przez granicę interoperacyjności. Ponadto można mapować punkt wejścia na inną nazwę, efektywnie zmieniając nazwę funkcji.

Poniżej znajduje się lista możliwych przyczyn zmiany nazwy funkcji DLL:

  • Aby uniknąć używania nazw funkcji interfejsu API uwzględniających wielkość liter

  • Aby zachować zgodność z istniejącymi standardami nazewnictwa

  • Aby obsłużyć funkcje, które przyjmują różne typy danych (deklarując wiele wersji tej samej funkcji DLL)

  • Aby uprościć korzystanie z interfejsów API zawierających wersje ANSI i Unicode

W tym temacie pokazano, jak zmienić nazwę funkcji DLL w kodzie zarządzanym.

Zmiana nazwy funkcji w Visual Basic

Visual Basic używa słowa kluczowego Function w instrukcji Declare , aby ustawić pole DllImportAttribute.EntryPoint. W poniższym przykładzie przedstawiono podstawową deklarację.

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

Punkt wejścia MessageBox można zastąpić MsgBox, dołączając słowo kluczowe Alias do swojej definicji, jak pokazano w poniższym przykładzie. W obu przykładach Auto słowo kluczowe eliminuje konieczność określenia wersji zestawu znaków punktu wejścia. Aby uzyskać więcej informacji na temat wybierania zestawu znaków, zobacz Określanie zestawu znaków.

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

Zmiana nazwy funkcji w języku C# i C++

Za pomocą DllImportAttribute.EntryPoint pola można określić funkcję DLL według nazwy lub porządkowej. Jeśli nazwa funkcji w definicji Twojej metody jest taka sama jak punkt wejścia w bibliotece DLL, nie musisz jawnie wskazywać funkcji używając pola EntryPoint. W przeciwnym razie użyj jednej z następujących form atrybutu, aby wskazać nazwę lub liczbę porządkową.

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

Zwróć uwagę, że musisz prefiks porządkowy z znakiem funta (#).

W poniższym przykładzie pokazano, jak zastąpić MessageBoxA na MsgBox w kodzie przy użyciu pola 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);

Zobacz także