Spécification d'un point d'entrée

Un point d’entrée identifie l’emplacement d’une fonction dans une DLL. Dans un projet managé, le nom d’origine ou le point d’entrée ordinal d’une fonction cible identifie cette fonction dans les limites d’interopérabilité. De plus, vous pouvez mapper le point d’entrée à un autre nom pour renommer la fonction de façon plus appropriée.

Voici une liste de raisons possibles pour renommer une fonction de DLL :

  • Éviter d’utiliser des noms de fonction API respectant la casse.

  • Utiliser un nom respectant les conventions de nommage actuelles.

  • Prendre en charge les fonctions qui acceptent différents types de données (en déclarant plusieurs versions de la même fonction DLL).

  • Simplifier l’utilisation des API qui contiennent des versions ANSI et Unicode.

Cette rubrique montre comment renommer une fonction DLL dans du code managé.

Renommer une fonction dans Visual Basic

Visual Basic utilise le mot clé Function dans l’instruction Declare pour définir le champ DllImportAttribute.EntryPoint. L’exemple suivant illustre une déclaration simple.

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

Vous pouvez remplacer le point d’entrée MessageBox par MsgBox en incluant le mot clé Alias dans votre définition, comme dans l’exemple suivant. Dans les deux exemples, le mot clé Auto vous évite de devoir spécifier la version du jeu de caractères pour le point d’entrée. Pour plus d’informations sur la sélection d’un jeu de caractères, consultez Spécification d’un jeu de caractères.

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

Renommer une fonction dans C# et C++

Vous pouvez utiliser le champ DllImportAttribute.EntryPoint pour spécifier une fonction DLL à l’aide d’un nom ou d’un ordinal. Si le nom de la fonction dans votre définition de méthode est le même que le point d’entrée dans la DLL, vous n’avez pas besoin d’identifier explicitement la fonction à l’aide du champ EntryPoint. Sinon, utilisez l’une des formes d’attribut suivantes pour spécifier un nom ou un ordinal :

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

Notez que vous devez ajouter le préfixe # (signe dièse) à un ordinal.

L’exemple suivant montre comment remplacer MessageBoxA par MsgBox dans votre code à l’aide du champ 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);

Voir aussi