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 internes à 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 statiques 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 (
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înes de caractères.
Exemple
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"
.
Exemple
' 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
.
Exemple
' 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