Gambas France BETA


Pas de compte ? Incription

Interfacer une librairie avec Gambas 3...

12
AuteurMessages
spheris#16 Posté le 30/9/2022 à 17:11:35
LinuxOS, Valaquarus,
Merci, je l'ai trouvé, je vais potasser le truc.
spheris#17 Posté le 3/10/2022 à 21:00:59
LinuxOS,
J'ai analysé attentivement ton code et j'ai vraiment besoin d'un petit coup de pouce :

Voici comment j'ai procédé :

J'ai ouvert le projet gb.sshclient.
Dans la classe Sshclient, j'ai remarqué que la librairie utilisée est libssh:4
A) que signifie le symbole 'deux points' ? et 4 est-ce la version?
B) je suis allé sur le net et j'ai téléchargé les sources de cette librairie pour voir les methodes internes.

Je voudrais savoir pourquoi tu définis :

1
PRIVATE EXTERN ssh_get_status(SshSession AS POINTER) AS INTEGER


par exemple.
je recherche dans le rep des sources un fichier contenant la chaine ssh_get_status, et là j'en ai plein (presque 10)
Un gros paquet de fichiers C,h, etc...
lequel choisir, lequel regarder?

Tu vois, pas mal de carences, j'ai besoin d'aide, si tu as un moment.

peux tu m'expliquer succintement quel est ta démarche pour choisir d'utiliser cette fonction ?
Merci pour ta réponse.
linuxos#18 Posté le 5/10/2022 à 18:22:11
Un peu de sel, de poivre et la crevette sera... Bonjour Spheris,

Bon voyons comment faire avec tout ça, car c'est vrai que ce n'est pas forcément simple.

Prenons pour hypothèse que je travaille sur Fedora 35 donc j'utilise des pacakges RPMS.
Dans mon cas, le package concernant la librairie 'libssh' est le suivant:

libssh-0.9.6-1.fc35.x86_64


Donc si je regarde le contenu du package:

$ rpm -ql libssh-0.9.6-1.fc35.x86_64
/usr/lib/.build-id
/usr/lib/.build-id/1e
/usr/lib/.build-id/1e/466b1f1c44646e8ef4279b82980df32fa03261
/usr/lib64/libssh.so.4
/usr/lib64/libssh.so.4.8.7
/usr/lib64/libssh_threads.so.4
/usr/lib64/libssh_threads.so.4.8.7
/usr/share/doc/libssh
/usr/share/doc/libssh/AUTHORS
/usr/share/doc/libssh/BSD
/usr/share/doc/libssh/ChangeLog
/usr/share/doc/libssh/README
/usr/share/licenses/libssh
/usr/share/licenses/libssh/COPYING


Donc 'libssh:4' faire référence a ceci ==> /usr/lib64/libssh.so.4
car si on regarde du coté système les librairies connues:

$ ldconfig -p | grep libssh
libssh2.so.1 (libc6,x86-64) => /lib64/libssh2.so.1
libssh2.so.1 (libc6) => /lib/libssh2.so.1
libssh2.so (libc6,x86-64) => /lib64/libssh2.so
libssh2.so (libc6) => /lib/libssh2.so
libssh.so.4 (libc6,x86-64) => /lib64/libssh.so.4
libssh.so.4 (libc6) => /lib/libssh.so.4
libssh.so (libc6) => /lib/libssh.so

Si j'avais mis uniquement 'libssh', Gambas aurait utilisé 'libssh.so (libc6) => /lib/libssh.so' qui correspond a une autre librairie SSH differente.
Dans le cas ou il n'y a qu'une seule librairie connue dans le système, pas besoin de préciser la 'version'.

Ensuite, comment trouver les fonctions déclarer dans Gambas et leurs parametres respectifs à transcrire en variables Gambas:
Pour cela il est necéssaire soit d'installer le package SOURCE de la librairie (DEV package) ou d'avoir les sources quelque part.
Il faut analyser, et c'est la que les choses se corse un peu, les fichiers *.h, car en langage C, c'est là que sont exposées les fonctions, qui sont elles-mêmes écrites dans les fichiers *.c

$ rpm -ql libssh-devel-0.9.6-1.fc35.x86_64
/usr/include/libssh
/usr/include/libssh/callbacks.h
/usr/include/libssh/legacy.h
/usr/include/libssh/libssh.h
/usr/include/libssh/libssh_version.h
/usr/include/libssh/libsshpp.hpp
/usr/include/libssh/server.h
/usr/include/libssh/sftp.h
/usr/include/libssh/ssh2.h
/usr/lib64/cmake
/usr/lib64/cmake/libssh
/usr/lib64/cmake/libssh/libssh-config-noconfig.cmake
/usr/lib64/cmake/libssh/libssh-config-version.cmake
/usr/lib64/cmake/libssh/libssh-config.cmake
/usr/lib64/libssh.so
/usr/lib64/libssh_threads.so
/usr/lib64/pkgconfig/libssh.pc



Donc si l'on analyse le fichier '/usr/include/libssh/libssh.h' on va trouver ceci pour par exemple la fonction 'ssh_get_status'

$ cat /usr/include/libssh/libssh.h | grep ssh_get_status
LIBSSH_API int ssh_get_status(ssh_session session);


Au final, on peut voir que la fonction C 'ssh_get_status(ssh_session session) retourne un 'int' (Integer), qui peut être traduit en Gambas par un 'Integer' aussi.
Pour les arguments qu'attend la fonction, ici c'est du type 'session', ce qui correspondra a un Pointer en mémoire vers une Structure C, donc en Gambas il faudra lui transmettre l'adresse d'un Pointer mémoire.
Ce pointer doit être déclaré dans Gambas avant d'utiliser cette fonction 'ssh_get_status' par

Dim pSshSession as Pointer

Ensuite il faudra initialiser la Session SSH comme souvent avec des librairies C

Ici se sera: pSshSession = ssh_new() ' Qui te revoie un Pointer mémoire comme référence que la session que tu viens de créer.

Enfin tu pourra faire: Print "SSH Status: " & ssh_get_status(pSshSession)

Je récapitule:
1
2
3
DIM pSshSession AS POINTER
pSshSession = ssh_new()
PRINT "SSH Status: " & ssh_get_status(pSshSession)


Je précise que ce que je viens de décrire est valable pour la librairie SSH dont on parle, c'est peu être différent avec la librairie que tu veux utiliser de ton coté.

Généralement, c'est cela se passe de la maniere suivante, dans la librairie concernée il y a une fonction pour initialiser une 'session' qui renvoie un Pointer mémoire et c'est ce Pointer mémoire que tu utilises pour le reste de la librairie.
Parfois, il n'y a pas de fonction dans la librairie pour initialiser une session, et la librairie attend que tu lui transmette une 'Structure' pour pouvoir fonctionner.
Dans ce cas il faudra déclarer la dite 'Structure' que tu trouvera aussi dans le fichier *.h de la librairie.
Il sera nécéssaire de convertir les variables de la dite 'Structure' C --> en variables Gambas.

Voila, commençons pas la, on rentrera plus en détail au besoin, pour pas surcharger trop le cerveau.

J'espere ne pas avoir été trop brouillon et assez clair.

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
spheris#19 Posté le 10/10/2022 à 07:48:00
Merci pour ces ifos claires.
Je vais tenter de résumer pour voir si j'ai compris :

Je voudrais utiliser la librairie externe libssh.so.4 donc je dois saisir ce code en début de module, classe ou form :

1
EXPORT libssh:4


Ensuite pour connaitre les méthodes utilisées pour manipuler la librairie, il me suffit d'aller lire dans les fichier sources.h de cette librairie.
Ici pour notre exemple get_ssh

Il suffit simplrement de transcrire du c en gambas et le tour est joué.

Quelques règles de transcription :
(A venir...)
vuott#20 Posté le 10/10/2022 à 14:51:11
Ne cedere ineluctabili possimus
Merci pour ces ifos claires.
Je voudrais utiliser la librairie externe libssh.so.4 donc je dois saisir ce code en début de module, classe ou form :

1
EXPORT libssh:4

La déclaration de la librairie externe peut se faire au travers de l'instruction "Library" et en tout cas "avant" la déclaration des fonctions externes que vous allez utiliser.
Exemple:
1
LIBRARY "libssh:4"

https://gambaswiki.org/wiki/lang/library?l=fr

La librairie peut également être déclarée à la fin de la déclaration de la fonction externe, comme vous l'avez fait dans l'exemple de votre premier message.

Voici un exemple simple pour obtenir la liste de toutes les variables d'environnement de votre système en utilisant les ressources de GLIB-2.0:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
LIBRARY "libglib-2.0:0.6400.6"

' gchar ** g_get_environ (void)
' Gets the list of environment variables for the current process.
PRIVATE EXTERN g_get_environ() AS POINTER

' void g_strfreev (gchar **str_array)
' Frees a NULL-terminated array of strings.
PRIVATE EXTERN g_strfreev(str_array AS POINTER)


PUBLIC SUB Main()

DIM en AS POINTER
DIM i AS INTEGER
DIM s AS STRING

en = g_get_environ()
IF en == 0 THEN Error.Raise("Errore !")

REPEAT
s = String@(Pointer@(en + i))
PRINT s
i += SizeOf(gb.Pointer)
UNTIL s == NULL

g_strfreev(en)

END
12