Appel de plate-forme, exemple de technologie
Mise à jour : novembre 2007
Cet exemple effectue une démonstration des techniques permettant d'appeler des fonctions exportées à partir d'une bibliothèque non managée. Il indique comment :
déclarer des différents types ;
utiliser les attributs disponibles pour modifier le comportement par défaut ;
utiliser des méthodes du type Marshal ;
déterminer les aspects des opérations garbage collection et du modèle de thread susceptibles d'affecter les résultats.
Certains exemples utilisent des fonctions exportées à partir des bibliothèques Windows, tandis que d'autres utilisent des fonctions exportées à partir d'une bibliothèque personnalisée. Certains exemples utilisent des bibliothèques qui ne sont pas disponibles sur toutes les plateformes Windows ou utilisent des fonctions d'une façon non prise en charge sur toutes les plateformes Windows. Toutefois, cela ne vous empêche pas de comprendre les règles d'appel propres aux différentes plateformes utilisées dans un exemple.
Voici la structure des répertoires de ces exemples :
Répertoire |
Contenu |
---|---|
WinAPIs |
L'appel de plateforme illustre l'utilisation de fonctions exportées à partir de bibliothèques Windows |
WinAPIs\CS |
Sources écrites en C# |
WinAPIs\VB |
Sources écrites en Visual Basic |
Custom |
L'appel de plateforme a illustré l'utilisation des fonctions exportées à partir d'une bibliothèque de types personnalisée. |
Custom\CS |
Sources écrites en C# |
Custom\LIB |
Source de bibliothèque de types personnalisée |
Custom\VB |
Sources écrites en VB |
Pour plus d'informations sur l'utilisation des exemples, consultez les rubriques suivantes :
Pour générer les exemples à partir de l'invite de commandes
Ouvrez une fenêtre d'invite de commandes et accédez à l'un des sous-répertoires propres aux différents langages.
Tapez msbuild [nom de fichier].sln à la ligne de commande.
Remarque : Les exemples d'appel de plateforme personnalisé ne peuvent être générés qu'à l'aide de Visual Studio.
Pour générer les exemples à l'aide de Visual Studio
Ouvrez l'Explorateur Windows et accédez à l'un des sous-répertoires spécifiques aux différents langages.
Double-cliquez sur l'icône de [nom de fichier] .sln pour ouvrir le fichier dans Visual Studio.
Dans le menu Générer, sélectionnez Générer la solution.
Pour exécuter les exemples
Accédez à l'un des répertoires propres aux différents langages dans le répertoire WinAPIs ou dans le répertoire Custom (qui contiennent les fichiers exécutables générés).
Tapez le nom du fichier exécutable à la ligne de commande.
Remarque : Cet exemple génère des applications console. Vous devez les lancer séparément, à l'aide de l'invite de commandes, afin de pouvoir afficher leur sortie.
Configuration requise
Ces exemples requièrent des en-têtes Windows qui sont disponibles pour votre projet si vous les générez à l'aide de Microsoft Visual Studio 2005 ou de l'invite de commandes de Visual Studio 2005, ou si le Kit de développement Platform SDK (en anglais) est installé et spécifié dans un chemin d'accès Include.
Notes
Les tables suivantes résument les rubriques illustrées par ces exemples et répertorient les emplacements des fichiers sources des exemples mentionnés dans cette rubrique.
Comment utiliser les attributs d'appel de plateforme
Attribut |
Description |
Exemple |
---|---|---|
EntryPoint |
Renomme une fonction à des fins d'utilisation dans un code managé. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
Choisit la façon dont les chaînes sont marshalées ; affecte également les critères de recherche de noms de fonctions. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
Indique si le nom du point d'entrée dans la DLL non managée doit être modifié pour correspondre à la valeur CharSet. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
Appelle des fonctions avec varargs. |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
Modifie les fonctions qui retournent HRESULT. |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
Garantit que le code d'erreur est enregistré après un appel de fonction. |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
Comment marshaler des structures et des unions
Type |
Description |
Exemple |
---|---|---|
structure ByVal |
Passe une structure en tant que paramètre In. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
structure ByRef |
Passe une structure en tant que paramètre In/Out. |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
classe ByVal |
Passe une classe avec des membres entiers uniquement comme paramètre In/Out. |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
Structure avec des structures imbriquées (aplaties) |
Produit une classe qui représente une structure avec des structures imbriquées sur un côté non managé. La structure est aplatie dans une grande structure sur le côté managé. |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
Structure avec des structures imbriquées (non aplaties) |
Passe une structure avec une structure incorporée. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Structure qui contient le pointeur vers une autre structure |
Passe une structure contenant un pointeur vers une autre structure comme membre. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Tableau des structures qui contiennent uniquement des nombres entiers ByVal |
Passe un tableau de structures contenant uniquement des entiers comme paramètre en entrée/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Tableau des structures qui contiennent des nombres entiers et des chaînes ByRef |
Passe un tableau de structures contenant des entiers et des chaînes comme paramètre Out. L'appelé alloue de la mémoire pour le tableau. |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
Unions avec des types valeur |
Passe une union avec des types valeur (entier et double). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Unions avec des types mélangés |
Passe une union avec des types mélangés (entier et chaîne). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Comment marshaler des tableaux
Tableau |
Description |
Exemple |
---|---|---|
Tableau d'entiers ByVal |
Passe un tableau d'entiers comme paramètre en entrée/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Tableau d'entiers ByRef |
Passe un tableau d'entiers comme paramètre en entrée/Out. Le tableau peut être redimensionné. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Tableau 2D d'entiers ByVal |
Passe une matrice d'entiers comme paramètre In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Divers
Type d'élément |
Description |
Exemple |
---|---|---|
HandleRef |
Présente un cas d'utilisation de HandleRef pour empêcher les opérations garbage collection. |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
pointeurs fonction |
Passe un délégué vers une fonction non managée qui s'attend à un pointeur fonction. |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
Appelle une fonction avec void* comme paramètre. |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
Utilise GCHandle pour passer un objet managé à une fonction non managée attendant LPARAM. |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
Thread cloisonné (STA, Single-Threaded Apartment)/Thread cloisonné (MTA, Multithreaded Apartment). |
Change les paramètres de cloisonnement par défaut lorsqu'une fonction non managée appelle CoInitialize. |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
Pour plus d'informations sur l'appel de plateforme, consultez les commentaires inclus dans les fichiers de code source.
Voir aussi
Concepts
Consommation de fonctions DLL non managées
Exemples d'appel de plate-forme