Newsgroup: it.comp.lang.visual-basic
Titolo: DCOM, Installazione e comportamento

A chi ha affrontato il problema DCOM, vorrei chiedere un paio di
informazioni.
Sto realizzando un progetto di un componente che risiederà su un server
(ActiveX-EXE) e che deve essere richiamato da vari client.
1) Ho bisogno che questo oggetto gestisca in modo sincrono e come "FIFO" le
richieste dei vari client (cioè voglio sia che l'ordine temporale
d'esecuzione delle chiamate rimanga quello di come sono state fatte, sia che
se sto eseguendo la chiamata del client A quella del client B resta in
attesa del suo turno).
Per fare questo basta settagli il Pool di trheading a 1 solo thread?
2) Qual è il modo più semplice di installazione sia sui client che sul
server?
Devo giocare con la voce "servizi componenti" del pannello di controllo?
(non mi è nemmeno molto chiara la differenza tra COM+ DCOM e MTS...)
3) E' possibile per l'ActiveX-exe conoscere il nome del client che ha
effettuato la chiamata?
Ciao, grazie.
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 effettuato la chiamata?
Penso che in modo semplice, no.
Però puoi imporre tutte le limitazioni di esecuzione del componente
attraverso il configuratore DCOM .. altrimenti chiunque della lan potrebbe
istanziare i tuoi oggetti DCOM, e questo non è bello.
Se vuoi sapere il nome della macchina chiamante o dell'utente ecc.. puoi
creare un metodo di login (anche se da codice server non puoi impedire che
venga creata l'istanza dell'oggetto di login e neanche la puoi abbattere).
Se ti serve altro nello specifico chiedi pure.
Saluti

 istanziare i tuoi oggetti DCOM, e questo non è bello.
Non è tanto per la sicurezza, quanto per poter fare un log di chi fa 
cosa, anche per poter risolvere eventuali problemi.
Avevo pensato a un metodo tipo Login, ma poi, essendo il processo unico, 
non posso comunque sapere chi sta chiamando in quel momento, ma solo 
avere la lista dei connessi.
Ciao

 avere la lista dei connessi.
Il processo è unico ma non lo sono le istanze client; ogni New è una nuova
istanza sul server
Saluti

 istanza sul server
Ummmm... infatti questa era una prova che stavo per fare.
Solo che così si mantiene il sincronismo del punto 1?
In teoria sì, essendo a singolo thread... spero :)
Ciao

 In teoria sì, essendo a singolo thread... spero :)
Penso che sia imprevedibile .. cioè se il client A esegue un metodo server e
subito dopo (distanza di 1 secondo) il client B esegue lo stesso metodo,
credo che non ci siano garanzie sul fatto che il metodo venga eseguito con
lo stesso ordine di chiamata, anche perchè le condizioni dipendono anche da
fattori esterni quali : stato della rete, tipologia di connessione, stato
del sistema in generale ecc..
Comunque in .net il dcom è stato sostituito da una tecnologia migliore,
nativa nel framework, ma non ricordo il nome.
Saluti

 nativa nel framework, ma non ricordo il nome.
Può darsi, ma io lo devo fare per VB :)
Ciao

 mano...
dimenticavo .. hai registrato il componente sul server ?
nome_componente.exe /REGSERVER
anche sul server devi configurare le classi con il DCOMcnfg.exe
vai nel dcomcnfg.exe, seleziona la tua classe - properties -
su protezione, assicurati che per ognuno dei 3 tipi di permesso sia incluso
SYSTEM e la macchina server;
il server alza eventi sul client ?
Saluti

 il server alza eventi sul client ?
Per ora no, ma in futuro non si sa.
Comunque la cosa stana è questa: nell'elenco delle APP DCOM registrate 
vedo una classe del mio componente, e non capisco in base a cosa abbia 
scelto quella da elencare anziche altre...
ora il server è un PC con winXP e il configuratore è leggermente diverso 
da quello di win9x e 2000.
Ciao, grazie

 da quello di win9x e 2000.
si, il clireg lo trovo un po' strano anch'io .. è per questo che uso il
dcomcnfg manualmente (ho 20 macchine max).
in realtà non ho mai provatato ad utilizzare una macchina client come server
dcom.
A questo punto mi viene in mente solo che il firewall di xp blocchi per
default dcom (o il firewall della lan);
oppure hai la possibilità di usare macchine 2000 per delle prove ?
E' vero che la createobject() ti consente di specificare su quale macchina
eseguire l'oggetto e che non ti devi preoccupare delle compatibilità ma,
secondo me, è conveniente sfruttare le funzionalità dell'early binding; se
poi dovrai generare eventi sul client, ti perdi la possibilità di dichiarare
col withevents e ripiegare sulle funzioni di callback (che funzionano anche
meglio degli eventi ma che non sono di certo il modo più lineare per
programmare).
Saluti
PS : quando circa 3 anni fa mi sono approcciato a DCOM, dopo una settimana
di tentativi ho scritto a Francesco Balena in persona, il quale mi ha
risposto (veramente a tempo di record) dandomi i link diretti ai siti MS
(quelli che tu hai già).
Direi che è stato alquanto gentile.

 Direi che è stato alquanto gentile.
Peccato che il DCOMCnfg per win fino al 2000 (quello descritto in questi 
doc) sia diverso da quello di XP... che comunque mi pare di aver provato 
in tutte le salse.
Ciao, grazie ancora.

 Perchè, cosa cambia se dovessi generare eventi?
In pratica devi dare i permessi all'oggetto DCOM installato sul client di
eseguire funzioni generate dal server (è per questo che bisogna annullare il
livello di identificazione)
Saluti

Fox Mulder wrote:
Allora, credo di aver trovato... e non ho parole, solo parolaccie!
Ho provato a fare un progetto da zero aggiungendo a mano a mano le 
classi che mi servivano... e tutto continuava a funzionare...
Ho controllato tutti i flag del progetto...
Sono arrivato a questo sconvolgente risultato: se metto la descizione 
del progetto mi da un costante errore 70: accesso negato.
Senza la descrizione del progetto tutto funziona usando la 
CreateObject(classe, server) (anche se ho usato il clireg32... boh).
Per fortuna posso comunque usare la .tlb tra i riferimenti cosě posso fare:
Dim x as myclass
Set x = CreateObject("prj.myclass", server)
e sfruttare l'intellisense.
Se uso la
Set x = New MyClass
o la CreateObject senza server ottengo un errore di automazione 
"impossibile trovare il modulo specificato".
Questo senza configurare niente sul client oltre al clireg32.
Inoltre sul server ho dovuto permettere l'accesso all'utente interattivo 
poichč ho un form nel mio Ax-exe, altrimenti ancora errore 70.
Ora provo senza il clireg32 che a questo punto mi pare inutile.
Ciao