Bravissimo Martin P. Cristia (tercoide) nel aver trovato la soluzione con il Puntatore a Funzione in C.
Vi mostro una semplificazione/precisazione dei suoi due codici:
Library "/tmp/libesterna"
' int funz_C(int n, void (*cbGambas) (int))
Private Extern funz_C(num As Integer, CallbackFunction As Pointer) As Integer
Public Sub Main()
Dim p As Pointer
Dim err As Integer
creaso()
' Assegna l'indirizzo di memoria della funzione "cbGambas" del progetto ad una variabile di tipo Puntatore:
p = cbGambas
' Invoca la funzione "funz_C" presente nel codice della ibreria esterna scritta in C:
err = funz_C(10, p)
If err <> 0 Then Error.Raise("Errore !")
End
Public Function cbGambas(num As Integer)
Print num
End
Private Procedure creaso()
File.Save("/tmp/libesterna.c", "int funz_C(int n, void (*cbGambas) (int)) { /* il 2° parametro è un Puntatore a Funzione ! */\n\n" &
" int i;\n\n" &
" for (i=1;i<=n;i++)\n" &
" cbGambas(i); /* Invoca la funzione del progetto Gambas */\n\n" &
" return 0;\n\n}")
Shell "gcc -o /tmp/libesterna.so /tmp/libesterna.c -shared" Wait
End