Liquida: un aggregatore di notizie

15 11 2008

Oggi vorrei segnalarvi un sito relativamente nuovo: si chiama Liquida. E’ un sito che si occupa di raccogliere notizie dal mondo e rendendole fruibili in modo molto intuitivo.
Inoltre ogni notizia può essere anche votata.
Ovviamente ci siamo anche noi!!!

Dategli una occhiata, è un sito che merita la vostra attenzione!

A presto!





Chiamare una funzione Pure Basic da newLisp

14 11 2008

google_translate.gif 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:

  1. Si crea un breve programma in Pure Basic, che si occupa di aprire la DLL di newLisp.
  2. Si scrive un breve pezzo di codice newLisp che verrà usato per “attaccare” la procedura Pure Basic ad una newLisp.
  3. Pure Basic fornirà, al newLisp, il puntatore (riferimento alla locazione di memoria di partenza) alla procedura di richiamare.
  4. 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)) 8)  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!