Newsgroup: it.comp.lang.visual-basic
Titolo: AddressOf e DLL ActiceX

Beh, se il buon giorno si vede dal mattino... oggi per voi sara' una
pessima giornata! Eccomi di nuovo qui.
Non che abbia risolto i problemi precedenti, ma stavo provando ad
affrontare il problema in modo differente.
In una classe devo registrare tramite una funzione, una funzione
(perdonate la ripetizione, ma si chiamano cosi') di callback.
Per fare questo, naturalmente, devo passare l'indirizzo della mia funzione
che devo chiamare tramite AddressOf.
Chiaramente per poter passare questo indirizzo, la mia funzione non puo'
"stare" nel modulo di classe, ma in un modulo Bas standard... e gia' la
cosa mi scoccia parecchio; comunque andiamo avanti.
Creo un modulo bas standard (nel mio pregetto ce ne e' gia' uno), scrivo
la mia funzioncina, e nella classe che deve registrarla, passo un
AddressOf. E fin qui tutto funziona.
Ora, per tenere le cose separate, avevo pensato di esportare classe e
modulo in una DLL ActiveX.
Apro un nuovo progetto, ci butto dentro la classe originale e il modulo a
cui fa riferimento, compilo come DLL... la mia funzione non viene piu'
chiamata!
Ci sono arcani motivi per cui accade cio?
ciao e gtrazie... Maurizio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ciao e gtrazie... Maurizio
Cioč tu hai una cosa del tipo
--- Progetto DLL ActiveX ---
    -- MyClass.cls --
    Public Sub ActivateCB()
    ...
        RegisterCallback AddressOf MyCallbackFunction
    ...
    End Sub
    -- MyModule.bas --
    Public Function MyCallbackFunction(..)
    End Function
--- Progetto EXE ---
    -- Modulo XYZ.bas --
    Sub Pincopallino
        Dim o As New MyClass
        o.ActivateCB
        ...
    End Sub
ho capito bene?
-- 
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 Cioè tu hai una cosa del tipo
...
Niente, niente, funziona...
Cmq. si, avevi capito bene :-) Era come dicevi tu.
Non ho ancora risolto i problemi di access violation (si dice cosi',
vero?),ma almeno questo va.
Potrebbe, il mio problema, derivare dal fatto che questa cavolo di scheda
mi restituisce 50 eventi al secondo?
Cioe', spiego:
come avevo detto (ma nessuno e' tenuto a ricordare i miei problemi :-) ),
devo comandare una scheda di play video in mpg2, questa scheda mi chiama
la mia funzione di callbak, 2 volte per ogni frame, che in pal fa un
totale di 50 volte al secondo. Naturalmente a me viene restituito anche un
codice bit-field con il tipo di evento che mi ha chiamato la funzione
(primo frame del filmato, ultimo frame del filmato, e tutta questa marea
di inizio-immagine). Io sono interessato solo ai primi due eventi, quindi
la mia funzione di callback verifica che gli eventi siano i due che mi
interessano, tramite un AND (if Evento AND 1 then...) naturalmente in
questo caso, 1 e' il valore dell'evento che voglio verificare.
Se effettivamente Evento = 1, allora dalla mia classe (o a questo punto
dalla DLL ActiveX) rialzo un evento verso il client che prendera' le
decisioni del caso.
Mi viene in mente la possibilita' che tutto questo lavoro (tra l'altro
dovrebbe essere asincrono, no?) porti delle nefande conseguenze.
Potrebbe essere un'idea giusta?
Grasssie.. Maurizio


 Grasssie.. Maurizio


 Ci sono arcani motivi per cui accade cio?
Boh... in teoria no, ma bisognerebbe vedere un po' di codice, oltre al fatto 
che come dicevo sono cose un po' delicate che di certezza non ne danno 
molte.
Ciao 

 Hai provato semplicemente a farle scrivere qualcosa nel debugger e poi
uscire?
...
No, ma posso provare :-)


 GPF.
...
Mmmm...
Io lo eviterei volentieri, ma purtroppo non c'e' modo di farne a meno, se
voglio raggiungere gli scopi per cui sto seduto qui davanti.
Cmq. la chiamata alla funzione, funziona ( ^___^ ), comuģincio a
convincermi del fatto che un evento ogni 2 centesimi di secondo, siano un
po' troppi!


 No, ma posso provare :-)
...vediamo cosa succede facendo così.


 ....vediamo cosa succede facendo cosě.
...
Fa il suo lavoro, cioe' ad ogni evento, scrive il codice dell'evento.
Ne ho una marea al secondo, ma va!
La cosa buffa e' che sostituendo la chiamata all'Api, l'istruzione
Debug.Print Evento, poco dopo la partenza, impalla tutto!
Ah, sto sempre nell'Ide, non ho compilato


[Di nuovo Timer]
E tra l'altro, come ce lo metto un controllo timer in una classe?
Mi viene in mente  CreateObject, ma poi non ho un contenitore dove
metterlo!


po' troppi!
Non č detto, potresti cercare di capire quanto dura effettivamente
l'elaborazione di un fotogramma usando un timer particolare tipo questo, che tra
l'altro usa poche risorse:
http://www.vbaccelerator.com/home/vb/code/Libraries/HiResTimer/article.asp
e magari scrivendo su un file o su dei registri i dati puoi anche capire se ci
sono sovrapposizioni tra le chiamate.
--
ciao
  Stefano

 Ah, sto sempre nell'Ide, non ho compilato
Mi fai vedere esattamente il codice completo della funzione callback?
-- 


 metterlo!
Non puoi, infatti.
Dovresti usare le API SetTimer/KillTimer che però necessitano di... una funzione
callback da definire in un modulo BAS.

 Mi fai vedere esattamente il codice completo della funzione callback?
...
Se io te la faccio vedere, tu cosa mi dai? :-)
Vuoi vedere cosa c'e' nella funzione che viene chiamata dalla scheda?
Semplice, nella versione attuale:
Nel modulo Bas standard facente parte della DLL:
Public Sub Funzione (ByVal Indirizzo As Long, ByVal Evento As Long)
' come avevo spiegato, Indirizzo e' un parametro arbitrario che ho passato
alla funzione che registra la callback, ed in questo momento vale 0
' Evento e' il valore che mi viene passato dalla scheda e che e' un
bit-field degli eventi possibili
    Debug.Print "Sto Qui"
End Sub
Cioe', meno di questo proprio non si puo'.
Avrai notato che in realta' la mia callback e' una sub, non una funzione,
ma ho provato in tutti e due i modi.
Boh


   Stefano


 Boh
Cioè nell'IDE con debug.print dà errore, se invece lo compili no?
Mentre sostituendo a debug.print la chiamata ad OutputDebugString non ha
problemi, né nell'IDE né in compilato. È così?


 problemi, né nell'IDE né in compilato. È così?
...
Gia', proprio cosi'
Cmq. provando provando, il timer sembra che, almeno come patch, funzioni.
Ho chiesto qui in ditta cosa preferiscono... una soluzione che non e' una
soluzione, ma breve e semplice per poter tirare fuori qualche cosa, ho un
lungo lavoro solo per capire come eliminare il problema.
Risposta? Intanto metti il timer, fallo funzionare, e poi con calma
vediamo una soluzione vera (ndr c'erano dubbi sigh!).
Comunque e' da risolvere in maniera piu' "sicura"


 Comunque e' da risolvere in maniera piu' "sicura"
Bene, per ora puoi accontentarti. Al momento di costruire qualcosa di
necessariamente più robusto ci tornerai sopra, magari con qualche info e
supporto in più da parte del produttore dell'hardware.


 lungo lavoro
...
M'e' scappata una H di troppo!
E che dire nell'oggetto... ActiCeX ?
Vabbe', di VB ci capisco poco, ma lo taliano, ci tengo che si sapesse che
lo parlassi bene :-)


 necessariamente più robusto ci tornerai sopra
...
Si, cioe' martedi o mercoledi mi tocca.
Cmq. per ora posso andare avanti con tutta l'altra roba.
Buon fine settimana a tutti, e buon pranzo a chi si rechera' a Verona
domani.
Ciaooo
