Newsgroup: it.comp.lang.visual-basic
Titolo: Come accedere da più client *_allo stesso_* oggetto activeX/exe server?

Il problema è semplice... ma non so come risolverlo (è la prima volta che
lavoro con oggetti COM)
Ho un pc con un oghgetto activeX exe serv er in esecuzione perenne, ed ho,
sulla stessa macchina, più client (standard exe) che devono accedere tutti
allo stesso oggetto activeX server in esecuzione.
Come devo scrivere il codice del client per fare questo?
Il librone della microsoft (peraltro piuttosto scarso, a mio parere) dice di
fare
   dim myObj as new  mioOggettoActiveXserverInEsecuzione
   myObj.mioMetodo
ma questo, oggiamente, mi crea un nuovo oggetto; mentre io voglio accedere
ai metodi dell'oggetto che è già in esecuzione (altrimenti che cavolo di
server è? :-)
Come faccio a far si che il client acceda all'oggetto server in esecuzione?
Grazie, MegaTest

 Come devo scrivere il codice del client per fare questo?
[SNIP]
Il problema non va risolto sui client, ma sul server ActiveX
Innanzi tutto nota subito, a scanso di equivoci, la distinzione tra
l'applicazione in esecuzione e gli oggetti che questa mette a disposizione;
hanno due valenze distinte, ed e' bene non fare confusione.
Le classi creabili in EXE ActiveX possono essere sostanzialmente di due
tipi: SingleUse e MultiUse
La prima fa si che, per ogni istanza di classe creata da un client, venga
avviata una nuova istanza *completa* dell'applicazione server; puoi avere
quindi piu' applicazioni server che girano contemporaneamente, ciascuna
delle quali fornisce un ambiente completamente isolato per ogni applicazione
client... nel tuo caso non e' quello che ci serve, anzi e' l'opposto!
La seconda implica invece che, alla prima istanza di classe creata, venga
avviata una nuova istanza di applicazione server, mentre tutte le chiamate
successive vengono processate dalla stessa istanza del server.
Nota che pero' si parla di "stessa istanza del server", non stessa istanza
di classe; queste per loro natura sono sempre distinte una dall'altra, sia
in applicazioni stand-alone che in componenti ActiveX come il tuo, e quindi
hanno una copia separata di tutti i membri pubblici e privati.
Avere un unica applicazione attiva ti comporta comunque alcuni effetti; uno
di questi e' il fatto che tutte le variabili *globali* del programma (quindi
per esempio quelle definite Public in un modulo BAS) esistono una sola
volta, e quindi possono essere condivise da tutte le istanze di tutte le
classi creabili/pubbliche del componente stesso, indipendentemente dal
client che le ha invocate, se tu potessi fare in modo che ad ogni richiesta
di istanza della classe A venisse utilizzata una variabile globale,
otterresti quello che ti serve, un unico oggetto per tutti i client...
ecco quindi la tua soluzione:
Dichiara una variabile pubblica GlobalA in un modulo BAS di tipo A (dove
'GlobalA' e' un nome arbitrario di variabile e 'A' e' la classe che ti
interessa)
Definisci una nuova classe B MultiUse e definisci un metodo pubblico che
abbia come risultato A; implementa il codice di questo metodo facendo in
modo che la prima chiamata in assoluto crei una nuova istanza della
variabile GlobalA, le successive usino invece l'istanza precedentemente
creata... ecco un esempio molto semplice, ma del tutto sufficiente allo
scopo
Public Function NewA() As A
If GlobalA Is Nothing Then
    'la prima volta la variabile non e' istanziata,
    'lo facciamo ora; le chiamate successive non passeranno da qui.
    Set GlobalA = New A
End If
'Restituiamo in ogni caso l'unica variabile globale
Set NewA = GlobalA
End Function
Questo e' tutto: quello che devono fare i client, al posto di creare
direttamente un istanza di A, e' creare un istanza di B e invocare il metodo
NewA, assegnando il risultato ad una variabile di tipo A; per sicurezza puoi
imporre questo comportamento in maniera programmatica semplicemente
definendo A come PublicNotCreatable piuttosto che MultiUse
Tutto e di piu' sull'argomento componenti lo trovi sul tuo MSDN... nella
versione online il link di partenza e'
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/htm
l/vbconComponentToolsGuide.asp
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Il problema non va risolto sui client, ma sul server ActiveX
[SNIP]
Dimenticavo... tutto questo bel discorso vale se, come descrivi sopra, i
client e il server sono tutti *sulla stessa macchina*; se invece volessi che
tutte la macchine client di una rete accedessero ad un unica istanza
condivisa del tuo server la cosa invece si complica, perche' e' vero che
viene creata una sola istanza di ActiveX, ma ovviamente e' *una per ogni
macchina differente*, non una per tutta la rete.
La soluzione in questo caso e' DCOM (Distributed COM, altrimenti noto come
"Automazione Remota"), per il quale ti rimando al link di prima...


> [SNIP]
Grazie di tutte le info, appena ho un attimo provo.
ciao, MegaTest

 "Automazione Remota"), per il quale ti rimando al link di prima...
Remote Automation non è la stessa cosa di DCOM :
è una tecnologia ormai superata la quale permetteva di proiettare le
chiamate ad un metodo/property ecc.. allo stesso oggetto installato però su
un server. Principali svantaggi rispetto a DCOM sono la lentezza (come se
DCOM fosse una scheggia) e l'impossibilità di generare eventi; di contro non
è necessario avere installato DCOM e la configurazione è automatica.
Saluti