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 :

Download sample

Pour générer les exemples à partir de l'invite de commandes

  1. Ouvrez une fenêtre d'invite de commandes et accédez à l'un des sous-répertoires propres aux différents langages.

  2. 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

  1. Ouvrez l'Explorateur Windows et accédez à l'un des sous-répertoires spécifiques aux différents langages.

  2. Double-cliquez sur l'icône de [nom de fichier] .sln pour ouvrir le fichier dans Visual Studio.

  3. Dans le menu Générer, sélectionnez Générer la solution.

Pour exécuter les exemples

  1. 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).

  2. 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

Référence

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

Autres ressources

Comportement de marshaling par défaut

Marshaling de données à l'aide de l'appel de plate-forme