Newsgroup: it.comp.lang.visual-basic
Titolo: Registrare ActiveX Exe

Salve a tutti, ho la necessità di distribuire un'applicazione che utilizza
un Exe ActiveX, il tutto chiaramente girerà sulla stessa macchina, per fare
i test ho copiato l'eseguibile ed il server su una stessa macchina credendo
di dover registrare il secondo con regsvr32 come fosse una dll, invece ho
ricevuto l'errore "impossibile trovare il punto d'ingresso della dll o ocx",
se lancio manualmente il server il mio applicativo riesce a creare l'istanza
e tutto funziona, quello che vorrei sapere è se è necessario registrare il
server o basta lanciarlo.
Grazie.
--------------------------------
Inviato via 
http://usenet.libero.it

 ricevuto l'errore "impossibile trovare il punto d'ingresso della dll o
ocx"
[SNIP]
Per gli eseguibili ActiveX il meccanismo e' leggermente differente; devi
utilizzare:
<il nome del tuo activex> /regserver
o
<il nome del tuo activex> /unregserver
il significato dovrebbe essere chiaro.
Nota che non hai nessun feedback sulla avvenuta registrazione, al contrario
del message box di regsvr32
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Ciao
Grazie 1000, avrei un altro piccolo dubbio, quando creerò il pacchetto di
installazione con il tool standard di vb ci sarà qualche opzione da
impostare per registrare l'activex?
Grazie ancora!


 impostare per registrare l'activex?
Sorry, e' un po' che non frequento il setup di VB, immagino di si ma non
sono sicuro... per ogni evenienza comunque e' fornito di sorgenti.


 impostare per registrare l'activex?
Grazie al cielo ci pensa il wizard del setup.
I problemi di installazione li avrai se deciderai di spostare il componente
su un'altra macchina ... devi configurare dcom manualmente.
Saluti


Fortunatamente girerà tutto sulla stessa macchina
Grazie ancora


 ha scritto nel messaggio
news:195Z223Z91Z133Y...@usenet.libero.it...

Allora non sai cosa ti perdi :)
Saluti


Innanzitutto grazie per l'aiuto, mi permetto di fare l'ultima domanda
confidando nella vostra gentilezz.
Il fatto è che non so come impostare
la
proprietà Instancing della classe del server, per adesso l'ho settata=
globalsingleuse
perchè esso verrà creato solo dal mio exe ed in una unica instanza, ma
vorrei una conferma...
Grazie ancora x tutto.


 vorrei una conferma...
Per funzionare, funziona, tieni pero' in considerazione il fatto che
l'impostazione 'SingleUse' non implica che possa essere creata una sola
istanza di quella classe, bensi' che per ogni istanza di classe creata
verra' avviato un nuovo processo completo (ovvero una copia completa
dell'eseguibile) e questo indipendentemente dal fatto che gli oggetti
vengano creati dal mesesimo o da diversi programmi client.
Viceversa con l'impostazione MultiUse l'eseguibile viene caricato solo alla
prima richiesta di classe, e le successive saranno soddisfatte dal medesimo
processo.
L'impostazione 'Global' invece comporta il fatto che i membri di quella
classe possono essere utilizzati dai client che referenziano il tuo ActiveX
senza necessariamente doverne creare un istanza, comportandosi a tutti gli
effetti come variebili e/o funzioni globali.


 vorrei una conferma...
E come hai impostato il modello di threading del componete ?


è impostato come da default "pool di thread 1 thread",
ora mentre testavo ho visto che se chiudo il client con ctrl-alt-canc, esso
non esegue le istruzioni per chiudere il server e lui continua a girare e a
notificare eventi anche se nessuno li riceve, poi quando rilancio il client
mi va in errore perchè cerca di creare una nuova istanza....
...aiuto che faccio????
come faccio a controllare dal client prima di istanziare il server se ne è
già in esecuzione un'istanza oppure dal server a controllare che il client
che l'ha instanziato è stato chiuso???
...pensavo di avere finito il progetto ma mi sa di no :(((
che casino!!!
qundo l'activexexe era una dll, girava tutto liscio :))
Ciao!!!


 Ciao
 
ciao a te e grazie.



scusa ho scritto una scemenza, hai ragione ho provato a compilare e si
comporta come dici tu, ho 2 istanze del server che girano, questo č un po
brutto, a questo punto potrei lasciare le cose come stanno controllando
prima di istanziare il client che non ci sia gia il server in esecuzione e
nel caso killarlo.
che ne pensi?
cmq se hai una soluzione piů elegante te ne sarei grato.


 ha scritto nel messaggio
news:80Z183Z112Z45Y1...@usenet.libero.it...

La classe va impostata a MultiUse così puoi condividere lo stesso processo
..
Impostando il pool di thread ad 1, ogni processo alloca al massimo 1 thread
per cui continua ad utilizzare le stesse risorse anche in caso di
continuative allocazioni e deallocazioni.
E' ovvio che ogni classe istanziata vive appunto nella propria istanza, ma
sono allocate nello stesso processo per cui sei in grado, per esempio, di
condividere lo stesso form o lo stesso modulo standard del tuoe Exe Ax.
Pertanto non hai bisogno di verificare se il server è già in esecuzione o
meno, piuttosto ti devi preoccupare di raccogliere in una collection
l'elenco dei riferimenti alle classi istanziate.
Il tuo problema non esattamente banale.
Quando chiudi il client in modo brutale (senza preoccuparti della
deallocazione della classe), l'istanza rimane ancora in vita; l'unica cosa
che ho fatto per risolvere tale problema è stata quella di far controllare
al componente server, ad intervalli regolari, lo stato del client. Se il
server non riceve una risposta valida rimuove ogni riferimento (richiamando
il metodo distruttore della classe) alla classe istanziata  dal client non
più funzionante aspettando poi il garbage c.
Però, escludendo particolari accrocchi con qualche API, non hai modo di
recuperare l'istanza precedentemente persa.
Saluti

 che ne pensi?
Che se vuoi un' unica istanza fisica del server devi impostare la classe
come MultiUse.
Per inciso, dato che nell'altro messaggio accennavi al fatto di avere avuto
una versione come ActiveX DLL, perche' l'hai trasformato in ActiveX Exe?
non che sia sbagliato, solo immagino che l'avrai fatto per modificarne il
comportamento... in sostanza cosa volevi ottenere?
Ad ogni modo, se ti interessa usare un Exe e avere quello che dicevi con "la
richiesta deve essere una ed unica, il server deve essere istanziato solo ed
esclusivamente
dall'unico client" allora devi comportarti in maniera differente:
Definisci una nuova classe principale, diciamo 'Application', e rendila
MultiUse mentre la ex classe principale, la tua, deve diventare
PublicNotCreatable (sempre la property Instancing)
In un modulo BAS definisci una variabile pubblica 'Public x As LaTuaClasse',
mentre nella classe Application aggiungi un metodo a piacere, diciamo
'StartUp' che restituisca un'istanza di LaTuaClasse; ora, dato che le
variabili globali sono condivise da tutto il programma, e dato che una
classe Multiuse comporta un unica istanza di Exe ActiveX in esecuzione, il
risultato e' che l'istanza di x e' sempre la stessa per tutti i client. Puoi
quindi sfruttare questa caratteristica nel metodo StartUp cosi':
Public Function StartUp() As LaTuaClasse
If x Is Nothing Then
    'la prima chiamata in assoluto crea l'unica istanza di X
    Set x = New LaTuaClasse
    Set StartUp = x
Else
    'per tutte le successive chiamate X risulta gia' istanziata, e quindi
    'la richiesta viene rifiutata; qui a titolo di esempio solleviamo un
    'errore di runtime al chiamante, in realta' puoi regolarti come credi.
    Err.Raise vbObjectError + 123, "Richiesta rifiutata"
End If
End Sub
I client ora non hanno piu' accesso diretto a LaTuaClasse (non e' piu'
creabile), ma devono transitare necessariamente dalla classe Application,
che come appena visto distribuira' solo un oggetto X al primo arrivato.
Vedi un po' se e' quello che ti serve...


 comportamento... in sostanza cosa volevi ottenere?
Allora l'applicazione chiama delle pagine asp per leggere/scrivere da un
database remoto, nella dll avevo la logica di accesso ad internet e
interrogazione delle pagine asp, siccome in alcune circostanze, come rete
particolarmente lenta o server web impicciato, dovevo aspettare anche
diversi minuti per ricevere i dati, durante i quali tutto il programma
rimaneva congelato, ho deciso di fare l'Active Exe, e di rendere le chiamate
asincrone ricevendo le risposte attraverso degli eventi.

Si il concetto è quello, credo che seguirò il tuo esempio, grazie mille per
la chiarezza e il tempo che mi hai dedicato..
Ciao!!!!



Ho capito Grazie, mettendo insieme i tuoi consigli e quello di Luca penso di
poter risolvere, il fatto è che i modi per far funzionare la cosa sono
tanti, però mi piacerebbe farlo in modo pulito senza impicci, speraimo
bene...
Ancora grazie, ciao.
