Newsgroup: it.comp.lang.visual-basic
Titolo: Problema DCOM per programmatori molto esperti

Il problema è il seguente:
ho un oggetto remoto Exe Activex che fornisce un accesso ai dati che chiamo
Server.exe;
devo tenere il conto del numero di client che accedono ai dati;
ho creato l'oggetto con la classe (MultiUse)  per l'accesso ai dati e con un
modulo.bas che contiene una variabile Public per il conteggio dei client,
che viene incrementata nell'evento class_inizialize;
ovviamente ho compilato con il modello di threading  "pool di threads" con
un solo thread, altrimenti la variabile globale non la posso condividere con
tutte le istanze.
Tutto funziona bene se apro più client dalla stessa workstation, ma se apro
un client dal PC1 e un client dal PC2 mi trovo sul server due oggetti
Server.exe aperti, invece che due istanze dello stesso oggetto.
In questo modo ovviamente perdo il numero globale di Client collegati.
Come posso fare per avere solo un Server.exe in esecuzione che crea istanze
della classe, anche se le chiamate arrivano da PC diversi ?
Spero di essere stato chiaro.
Grazie,
                                            Cristiano.

 ha scritto nel messaggio
news:zmdr6.13123$x3.3...@news2.tin.it...

Sbaglio .. o per accedere al componente remoto hai solo referenziato il
componente dandogli il path completo (\\Server\Cartella\Compoente.exe) ?
Prova a postare come hai registrato il componente sia sul client che sul
server e cosa hai usato per distribuire il componente.
Ti assicuro che una soluzione la si trova (dato che  ho buttato via 2
settimane per i componenti remoti).
Saluti

 settimane per i componenti remoti).
..solo 2 settimane?...:)...
comunque la tecnica funziona, aspettiamo il post...
Ciao
Franco
PS: peccato tu non sia venuto al meeting...


Probabilmente Fox non e' riuscito ad istanziarsi in remoto :-P
ciao, hal

Intanto vi ringrazio per l'interessamento.
Il componente Server.exe č stato installato sul Server mediante il pacchetto
di installazione di VB 6 Enterprise, poi ho controllato la configurazione
mediante Dcomcnfg.exe, creando le autorizzazioni per l'accesso, e ho
selezionato le opzioni:
- esegui sul computer locale
- esegui sul computer del dominio ..... ed ho selezionato il PC Server
Poi ho costruito il client mettendo nel pacchetto di installazione il
riferimento al file .vbr relativo al server.
Ho quindi installato due client, uno su un PC diverso dal Server e uno sul
Server utilizzzando il pacchetto di installazione di VB6.
Nel Client il riferimento al componente č fatto cosě:
dim obj as object
set obj = createobject("Server.classe","NomeServer")
il NomeServer č semplicemente il nome del server, nella caso specifico
"ServerNT01"     non lo ho scritto nella forma
\\ServerNT01\directory\Componente.exe
Grazie per l'interessamento.

 Probabilmente Fox non e' riuscito ad istanziarsi in remoto :-P
rotflone
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #25 delle Mitiche Brigate Takahashi sezione Sud

 Probabilmente Fox non e' riuscito ad istanziarsi in remoto :-P
:)))))))))))))))))))
P.S. Hal, ma tu non dormi mai? :))))))))

 set obj = createobject("Server.classe","NomeServer")
Perchè non usi
    Dim svr As Server.Classe
    ...
    Set svr = New Server.Classe
che ti permette di vedere i metodi e le proprietà esposte dalla classe....
(chiaramente devi avere impostato un riferimento al server in Riferimenti).
Ora se Server.Classe è Multiuse ogni volta che viene istanziata da un client
non parte
una nuova istanza del server (a meno che non ci sia una istanziazione di una
classe SingleUse
all'interno di Server.Classe - credo...oppure se tu non istanzi senza volere
una SingleUse).
Per quanto riguarda la Public con il numero di client connessi...io ho un
po' di allergia per
le Public....:-).
Se devi gestire un massimo di client magari con un controllo password,
potresti implementare una classe
di monitor per i client, che se abilitati, potranno vedere la classe del
server PublicNotCreable che effettivamente lavora con i dati... Fox non
sorridere..:-)....
ehm....forse non ti ho aiutato molto...
Ciao
Franco

 set obj = createobject("Server.classe","NomeServer")
Perchè non usi


 Probabilmente Fox non e' riuscito ad istanziarsi in remoto :-P
:)))))))))))))))))))


 ha scritto nel messaggio
news:98odej$gjb$1...@nreadA.inwind.it...

... non è più facile riscrivere Windows in assembly ?   :)
Io credo che Franco sia un vero maniaco della gestione delle sicurezze di
accesso.
Sono ben lontano dal criticare questo accanimento, anzi a volte provo
invidia nel sapere che a certe soluzioni non ci sarei mai arrivato.
Tuttavia mi permetto di dare una mia (ma sono convinto che sia di abbastanza
comune) soluzione al problema della monitorizzazione dei client connessi.
Certamente l'utilizzo di una variabile globale è il metodo più veloce per la
conservazione delle informazioni comuni.
L'evento che permette l'aggiornamento di tale variabile è ovviamente il
Class_Initialize; per contro la variabile conterà le nuove istanze della
classe ma non potrà fidarsi del relativo evento Class_Terminate per essere
decrementata (in quanto l'evento non sempre si verifica).
Il mio suggerimento è quello di utilizzare una collection (sempre Public)
che contenga i riferimenti alle istanze di una particolare classe (quella
cioè esposta ai client).
A questo punto il conteggio delle connessioni risulta + semplice, infatti
basta contare gli oggetti ancora istanziati nella collection.
Durante lo scroll della collection sarà inoltre possibile eliminare i
riferimenti agli oggetti che non hanno appunto un'istanza allocata.
La collection potrebbe poi tornare utile per alcune cose, come la notifica a
tutti i client di un evento ecc..
Aspetto novelle ..
    Saluti

Scheda applications, selezionare il componente dalla lista quindi
properties; per tutte le schede lasciare i valori di default (in modo che
automaticamente prenda i valori precedentemente impostati). Solo nella
scheda Identity è necessario impostare i dati dell'utente che accederà al
componente (vedere articolo Q171456 di Microsoft OnLine)
A questo punto sarebbe meglio riavviare il server.
NEL CLIENT
O lanciare il file Regcli.bat (che usa il clireg32.exe)  oppure ...
avvio->programmi-> Microsoft VisualStudio 6 -> Strumenti di Microsoft Visual
Studio 6 Edizione Enterprise-> RemAuto Connection Manager.
Quindi selezionare il componente dall'elenco, dal menu Registra selezionare
Remoto, dalla scheda Connessione server COM distribuito e l'indirizzo di
rete, scheda Accesso client, 4° OptionButtons, quindi applica (Connessione
server).
a questo punto dovrebbe essere tutto pronto.
se esegui il programma client "ProvaClient" dall'IDE ti consiglio, prima di
togliere il riferimento al componente, eseguire il programma (con
compilazione completa), far generare l'errore di compilazione sul
componente, ri-attaccare il riferimento.
ARTICOLI
Q267836 spiega come creare e distribuire un componente remoto con eventi
http://support.microsoft.com/support/kb/articles/Q267/8/36.ASP
Q268550 com econfigurare il DCOM nel server
http://support.microsoft.com/support/kb/articles/Q268/5/50.asp
Q269330 risoluzione di alcuni problemi relativi all'utilizzo e alla
registrazione di componeti remoti
http://support.microsoft.com/support/kb/articles/Q269/3/30.ASP
Q171456 questo è interessante perchè spiega un errore simile al mio. Ho
comunque provato ad impostare tutti i valori di Identity ma il risultato non
cambia.
http://support.microsoft.com/support/kb/articles/Q171/4/56.asp
Questo spiega esattamente come configurare il DCOM sul server per gestire
gli eventi e i callback
http://msdn.microsoft.com/msdn-files/026/000/114/Permissions_txt.htm
----------------------------------------------------------------------------
--------------
Fammi sapere ...
Ciao

 tutti i client di un evento ecc..
Molto bello! Infatti se la classe che istanziano i client ha eventi ed un
metodo che se richiamato
dal server fa generare l'evento, è possibile, nel client, gestire messaggi
dal server. Chiaramente
è necessario dimensionare con WithEvents usando un Riferimento al server (e
non con CreateObject).
Ogni tanto mi pare impossibile che si possa, eppure funziona (almeno mi
pare:))))
Fox, mi sa che Cristiano non ci "ascolta"...
Ciao
Franco


no dai ... ogni tanto anche lui guarderà la posta ... vero ?
Saluti

 no dai ... ogni tanto anche lui guarderà la posta ... vero ?
messaggio caduto nel baratro....
Ciao
Franco