Translate To English!
Diverso tempo fà ho avuto l’esigenza di far interagire un programma sviluppato in newLisp con un software fatto in Pure Basic. Facendo alcune prove, ero riuscito a chiamare una funzione Pure Basic da newLisp ma non riuscivo a passare i parametri.
Sono da poco ritornato sul problema, e sono finalmente riuscito a risolvere!
Per poter chiamare una funzione Pure Basic da un programma newLisp, si deve procedere come segue:
- Si crea un breve programma in Pure Basic, che si occupa di aprire la DLL di newLisp.
- Si scrive un breve pezzo di codice newLisp che verrà usato per “attaccare” la procedura Pure Basic ad una newLisp.
- Pure Basic fornirà, al newLisp, il puntatore (riferimento alla locazione di memoria di partenza) alla procedura di richiamare.
- newLisp potrà finalmente chiamare la procedura Pure Basic, passandogli anche i parametri!
Passiamo quindi a scrivere il codice necessario!
Prima di tutto apriamo la DLL newLisp (l’esempio è stato fatto sotto Ms Windows):
OpenLibrary(0, "newlisp.dll")
Global *newlisp = GetFunction(0, "newlispEvalStr")
If Not *newlisp
MessageRequester("Errore!", "errore. newLisp DLL non trovata!")
End
EndIf
Il codice è auto esplicativo: Apro la DLL e la assegno all’ID “0″ (zero). Dopodichè prelevo l’handle alla funzione newLisp newlispEvalStr. Mi raccomando: state attenti alle maiuscole, perchè è case-sensitive!
Questa è invece la procedura Pure Basic che dovrà essere richiamata da newLisp (chiamata miaFunzione() ):
Procedure miaFunzione(arg1.s, arg2.s, arg3.s)
MessageRequester("Debug", "Parametro 1: " + arg1)
MessageRequester("Debug", "Parametro 2: " + arg2)
MessageRequester("Debug", "Parametro 3: " + arg3)
EndProcedure
Il seguente codice è il programma newLisp che effettua la “magia”: il programma infatti preleva l’indirizzo di memoria della procedura Pure Basic, e fà in modo che possa essere usata da newLisp tramite la funzione foo. Quindi, non appena in newLisp verrà chiamata la funzione foo, newLisp richiamerà quella Pure Basic (miaFunzione).
nlProgram.s = "(set 'foo print)" + "(cpymem (pack {ld} 265) (first (dump foo)) 4)"
nlProgram + "(cpymem (pack {ld} " + Str(@miaFunzione()) + ") (+ (first (dump foo)) 12) 4)"
nlProgram + "(cpymem (pack {ld} {foo}) (+ (first (dump foo)) 8) 4)" + "(foo {Uno} {Due} {Tre})"
CallFunctionFast(*newlisp, @nlProgram)
CloseLibrary(0)
Alcune informazioni sul codice precedente: @miaFunzione() ritorna l’indirizzo di memoria a cui si trova la procedura Pure Basic. L’ultima riga contiene la stringa (foo {Uno} {Due} {Tre}) : essa è la riga newLisp che chiama la procedura Pure Basic, passandogli i parametri (stringa) Uno, Due, Tre.
CallFunctionFast(*newlisp, @punta) è usata per dare in pasto al compilatore newLisp il codice appena creato, compreso il codice di prova per chiamare la procedura PB.
Questo è il programma completo:
Procedure miaFunzione(arg1.s, arg2.s, arg3.s)
MessageRequester("Debug", "Parametro 1: " + arg1)
MessageRequester("Debug", "Parametro 2: " + arg2)
MessageRequester("Debug", "Parametro 3: " + arg3)
EndProcedure
OpenLibrary(0, "newlisp.dll")
Global *newlisp = GetFunction(0, "newlispEvalStr")
If Not *newlisp
MessageRequester("Errore!", "errore. newLisp DLL non trovata!")
End
EndIf
nlProgram.s = "(set 'foo print)" + "(cpymem (pack {ld} 265) (first (dump foo)) 4)"
nlProgram + "(cpymem (pack {ld} " + Str(@miaFunzione()) + ") (+ (first (dump foo)) 12) 4)"
nlProgram + "(cpymem (pack {ld} {foo}) (+ (first (dump foo))
4)" + "(foo {Uno} {Due} {Tre})"
CallFunctionFast(*newlisp, @nlProgram)
CloseLibrary(0)
I fatti sono meglio di 1000 parole: provare per credere! La procedura Pure Basic miaFunzione stamperà tre messaggi con gli argomenti passati dalla chiamata newLisp!
Anche per questa volta è tutto! Non dovreste avere particolari problemi ad adattare questo esempio per altri linguaggi.
Alla prossima!
Commenti Recenti