Newsgroup: it.comp.lang.visual-basic
Titolo: [½ OT] Usare le API con Javascript: progetto ambizioso o folle?

Ciao ad entrambi i NG, e innanzitutto perdonatemi il crosspost, ma proprio non
sapevo a quale dei due gruppi spedirlo. Forse leggendo il subject penserete
"questo qua è pazzo", e forse lo sono davvero. Ma confido nell'abilità dei
programmatori in entrambi i linguaggi per evitarmi inutili ore di improduttivo
wandering...
Allora, il problema da risolvere è: usare le funzioni di Windows (API) con
Javascript.
Prima soluzione: usare un ActiveX. Esistono già librerie contenenti le declare,
è vero. Ma quella che ho io non contiene nessuna classe creabile con new
ActiveXObject("server.class"). Ed è incompleta. Così mi sono detto: ne faccio
una io, che problema c'è? Magari anche con una minima interfaccia grafica,
giusto per dichiararla a design-time ed evitarsi altri casini.
Ecco però che mi pongo altri problemi:
 - molte API richiedono che alcuni parametri vengano passati ByVal o ByRef, e
sbagliare questo può pregiudicare la riuscita. Non solo Javascript passa le
variabili in un modo e basta, ma nemmeno so in QUALE modo vengano passate. Mi
rendo conto comunque che il problema in realtà non esiste, infatti alla MIA
funzione (quella dell'ActiveX, intendo) non importa come gli arrivino i
parametri, basta che arrivino. Se poi l'API fa storie, si immagazzina tutto in
variabili temporanee, non c'è problema
 - molte API usano strutture TYPE... e qui son dolori... perchè nè Javascript nè
VBScript hanno niente che possa essere usato come TYPE. A dire il vero, in
Javascript ci sarebbero gli object, ma temo non siano compatibili per pochi,
validi motivi:
    - length, anzichè i byte allocati, restituisce il numero di membri contenuti
nell'oggetto
    - temo che siano un tipo di dati non supportato da VB...
Insomma, quello che mi chiedo è: se faccio questo
function myObj(par1, par2){
    this.par1 = par1
    this.par2 = par2
    return this
}
varObj = new myObj("first", "second")
e passo varObj ad una funzione del tipo
'perdonatemi As Variant... ma ho paura che as Object non funzioni
Public Sub GetObject (var as Variant)
    MsgBox "parameter 1 = " & var.par1 & _
    vbCrLf & "parameter 2 = " & var.par2
End Function
la funzione da' un messaggio
parameter 1 = first
parameter 2 = second
oppure mi da' errore e basta?
Se funziona, il problema dei TYPE è risolto
 - casini vari: della finestra di IE non si possono sapere direttamente nè
l'hWnd, nè il ThreadId, nè l'hInstance. Per quanto riguarda ThreadId e hInstance
passo quelli dell'ActiveX, credo siano gli stessi dell'applicazione host, ma
l'hWnd? Si impone l'uso di un'interfaccia. Spero che con GetParent si riesca ad
ottenere l'handle della finestra server di IE...
Insomma, ho passato un'intera giornata a pensarci... voi che dite, si risolve in
qualche modo o è meglio che mollo tutto per tempo?

oppure mi da' errore e basta?
Non compilerebbe nemmeno...
Ciao
Ah, posterò la dll al sito comune prossimamente.

 Non è possibile fare nulla del genere.
Eh, mi sa che userò delle class, a questo punto. VB è un po' rigido per gestire
gli Object
Comunque, mi sento sempre più motivato ad usare un controllo utente, piuttosto
che un server senza interfaccia. Questo perchè avrei un hWnd che mi farebbe
molto comodo con le API che ne richiedono uno. Sarò pure folle, ma voglio
riuscire a creare e subclassare una finestra da Javascript... (i WM_ li gestirò
come altrettanti eventi dell'ActiveX, mi sembra l'unica strada possibile)
Ciao e grazie

come altrettanti eventi dell'ActiveX, mi sembra l'unica strada possibile)
Beh, anzichè legarti al subclass puoi intercettare i messaggi con gli hook.
Sono altrettanto validi e ti dicono l'hWnd della finestra anche figlia (cioè
dei singoli controlli) a cui sono rivolti i messaggi.
Non hai bisogno di impostare l'hWnd della finestra da subclassare perchè si
legano all'hInstance del thread.
Ho postato un esempio settimana scorsa al S.C. ma è sempre un po' lento
negli aggiornamenti...
Ciao

 dei singoli controlli) a cui sono rivolti i messaggi.
Eeeh... ma io gli hook non li so usare... ho appena imparato il subclassing...
eppoi quando crei una finestra puoi già settare (anzi, mi sa che DEVI) il Long
che punta alla callback, e quando mi sono accorto che le proc sono tutte uguali
(almeno quelle delle finestre), e che ne basta una sola...
In ogni caso, generare un evento ad ogni WM_ che te ne pare?

In ogni caso, generare un evento ad ogni WM_ che te ne pare?
Sì, non avevo pensato che una sola winproc potesse gestire più windows.
Potresti fare così.
Comunque gli hook funzionano sullo stesso principio, solo che sono più
specifici (solo eventi del mouse, della tastiera, tutti gli eventi della tua
app, ecc.).
Però il WindowLong lo puoi settare quando vuoi, l'importante è ripristinarlo
prima di distruggere la finestra.
Ciao

JS -> Trusted Java Applet -> Java Native Interface -> WIN32 API.
--
(o- .Andrea Censi........-o)
//\ ICQ#57209319         /\\
V_/_mox.pearl()libero.it_\_V

Chebbello che ssei, io di Java so solo che prende il nome da una marca di caffè
:) se voglio fare una app web-oriented la faccio ActiveX in VB


>Chebbello che ssei, io di Java so solo che prende il nome da una marca di caffč
Non era il nome di un'isola?
:)
---
the fly on the net
il webmaster piů alto del mondo
"the Art of JavaS." 
http://www.probo.it/aoj
"the devil inside" 
http://members.tripod.com/netfly
e-mail: 
net...@netbusiness.it

 >Chebbello che ssei, io di Java so solo che prende il nome da una marca di
caffè


 :) se voglio fare una app web-oriented la faccio ActiveX in VB
    Io uso di solito Netscape su Linux, quindi non la vedro' mai.
--
(o- .Andrea Censi........-o)
//\ ICQ#57087839         /\\
V_/_mox.pearl()libero.it_\_V

     Io uso di solito Netscape su Linux, quindi non la vedro' mai.
Non ti perdi nulla :)