Documentation de Gambas - /lang/extdecl

/lang/extdecl

# Déclaration de fonctions externes

{ PUBLIC | PRIVATE } EXTERN Identificateur ( [ Parametre AS TypeDonnee [ , ... ] ] ) [ AS TypeDonnee ] [ IN _ Library _ ] [ EXEC Alias ]

Ceci déclare une fonction externe située dans une bibliothèque partagée du système.

## Arguments

Les paramètres d'une fonction externe peuvent être de n'importe quel type de donnée Gambas, excepté Variant. Gambas adaptera automatiquement ses types de données a ceux de la machine.

Quand vous passez un objet, la fonction reçoit un pointeur vers ses données. Si l'objet est une classe, alors la fonction reçoit un pointeur vers les données statique de la classe.

Pour n'importe quel argument de type pointeur, utilisez le type de donnée Pointer.

Vous pouvez utiliser des arguments String, à moins que la fonction ne les modifie, car en Gambas les valeurs chaîne de caractères (String) sont des constantes partagées.

## Arguments pointeur

Si vous devez envoyer un pointeur sur une variable, vous pouvez utiliser la fonction VarPtr, mais seulement pour des arguments autres que les chaîne de caractères.

### Exemples

    EXTERN GetAFloat(Result AS Pointer, A AS Float, B AS Float)

    DIM fResult AS Float

    GetAFloat(VarPtr(fResult), Pi, Pi(2))

Utilisez aussi le pointeur quand l’argument de la fonction externe est de type taille mémoire (par exemple `size_t`), car ces types ont la même taille integer qu’un `void *`.

## Valeur de retour de Fonction

Certaines fonctions externes peuvent prendre comme argument un pointeur de fonction, ce pointeur étant utilisé comme valeur de retour.

Pour utiliser une fonction Gambas en retour :

- Déclarer simplement l’argument pointeur de fonction comme `Pointer` dans la déclaration de la fonction externe.

- Utilisez le nom de la fonction Gambas comme argument de la fonction externe.

### Exemple

    Private Extern qsort(base As Pointer, nmemb As Pointer, size As Pointer, compar As Pointer) In "libc:6"

    Private Sub Compare(pA As Pointer, pB As Pointer) As Integer

      ...

    End

    Public Sub Main()

      Dim aVal As Integer[]

      ...
      qsort(aVal.Data, aVal.Count, 4, Compare)
      ...

    End

Notez que vous pouvez employer toute fonction Gambas privée ou publique. Vous pouvez même utiliser les méthodes non-statiques : mais assurez vous que l’ objet auquel s’applique la Méthode est capturé au retour, et relâché à la fin du programme seulement.

## Valeur Retournée

La valeur retournée par une fonction externe peut être de tout type de donnée Gambas excepté Object et Variant

Si une fonction externe retourne une chaîne de caractères, alors Gambas retournera une copie de celle-ci.

Si vous avez besoin de la vraie chaîne de caractères retournée par la fonction, utilisez le type de donnée Pointer et la fonction StrPtr.

## Nom de la bibliothèque

Le nom de la bibliothèque est indiqué avec l'argument Library. Si vous ne le fournissez pas, alors le nom de celle indiquée par la dernière déclaration `LIBRARY` est utilisé.

Le nom de la bibliothèque doit être le nom de son fichier sans aucune extension ni numéro de version.

Par exemple, si vous voulez utiliser, la bibliothèque OpenGL nommée `libGL.so.1` sur votre système, le nom à utiliser avec Gambas est `"libGL"`.

Si vous avez besoin d'indiquer un numéro de version de la bibliothèque spécifique (les chiffres après l'extention `.so` pour Linux), Vous pouvez l'ajouter après, en les séparant avec le caractère double point.

Par exemple, si vous avez besoin explicitement de la version 1.0.7667 de la bibliothèque OpenGL, vous devez fournir le nom de bibliothèque suivant: `"libGL:1.0.7667"`.

### Exemples

    ' Je doit faire quelques ioctl!
    EXTERN ioctl(fd AS Integer, op AS Integer, arg AS Pointer) AS Integer IN "libc:6"

    ...

    Err = ioctl(MyStream.Handle, ... )

## Nom des fonctions

Le nom des fonctions dans la bibliothèque devient par défaut le nom de la bibliothèque dans Gambas. i.e. identifiant.

Si c'est impossible, ou non souhaitable, vous pouvez indiquer le vrai nom de la fonction avec le mot clef `EXEC`.

### Exemples

    ' Ce nom de fonction est déja un mot réservé de \Gambas!
    EXTERN SysOpen(Name AS String, Flags AS Integer, Mode AS Integer) AS Integer IN "libc:6" EXEC "open"

### Voir aussi

- Gestion des fonctions externes

- Comment Interfacer Gambas avec des bibliothèques Externes