Spécification d'un point d'entrée
Mise à jour : novembre 2007
Un point d'entrée identifie l'emplacement d'une fonction dans une DLL. Dans un projet managé, le point d'entrée ordinal ou nominal d'origine d'une fonction cible identifie cette fonction sur les limites d'interopérabilité. De plus, vous pouvez mapper le point d'entrée à un nom différent, en attribuant effectivement un nouveau nom à la fonction.
La liste suivante récapitule les raisons pouvant être à l'origine de l'attribution d'un nouveau nom à une fonction DLL :
pour éviter d'utiliser des noms de fonction API respectant la casse ;
pour respecter des normes d'attribution de noms existantes ;
pour prendre en charge des fonctions acceptant des types de données différents (en déclarant plusieurs versions de la même fonction DLL) ;
pour simplifier l'utilisation d'interfaces API contenant des versions ANSI et Unicode.
Cette rubrique indique comment renommer une fonction DLL dans du code managé.
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 de base.
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
Vous pouvez remplacer le point d'entrée MessageBox par MsgBox en incluant le mot clé Alias dans votre définition, comme le montre l'exemple suivant. Dans les deux exemples, le mot clé Auto rend inutile la spécification de la version du jeu de caractères du 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.
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
Vous pouvez utiliser le champ DllImportAttribute.EntryPoint pour spécifier une fonction DLL par son nom ou son ordinal. Si le nom de la fonction figurant dans la définition de votre méthode est le même que celui du point d'entrée dans la DLL, vous n'avez alors pas à identifier explicitement la fonction avec le champ EntryPoint. Sinon, utilisez l'une des formes d'attribut suivantes pour indiquer un nom ou un ordinal :
[DllImport("dllname", EntryPoint="Functionname")]
[DllImport("dllname", EntryPoint="#123")]
Notez que vous devez préfixer un ordinal avec le signe dièse (#).
L'exemple suivant montre comment remplacer MessageBoxA par MsgBox dans votre code à l'aide du champ 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);
Création de prototypes dans du code managé