Newsgroup: it.comp.lang.visual-basic
Titolo: [LUNGO]Server ActiveX son molto lamerozzo! come si fa ?

Beh proseguirei la mia "educazione" per arrivare a fare i miei 3tier!
La domanda del lamerozzo è la seguente:
Io ho il mio serverActiveX (dll)
dentro ho fatto un
Private Const MAXUSER = 10
Private mChi() As String 'Max 10 connessioni
che poi utilizzo in
...
Private Sub Class_Initialize()
    ReDim mChi(MAXUSER)
End Sub
ho poi un metodo che
Public Function EseguiSQL(ByVal SQL As String, ByVal NomeUtente As String)
As Object
Dim n As Long
Dim FlagRedim As Boolean
Dim FlagEsci As Boolean
FlagRedim = False
FlagEsci = False
For n = 1 To 10
 If Not (UCase(NomeUtente) = UCase(mChi(n))) Then
    FlagRedim = True
 End If
 If FlagRedim Then
    If AggiungiNomeUtente(NomeUtente) = False Then
        RaiseEvent IstruzioneSQLnoneseguita
        Exit Function
    Else
        FlagEsci = True
    End If
 End If
 If FlagEsci Then Exit For
Next
'manca la parte sql lo so!...dopo!..un problema per volta
End Function
...e logicamente la...
Private Function AggiungiNomeUtente(ByVal NomeUtente As String) As Boolean
Dim n As Long
For n = 1 To MAXUSER
    If (mChi(n) = "") Then
        mChi(n) = Trim(NomeUtente)
        AggiungiNomeUtente = True
        Exit Function
    End If
Next
RaiseEvent TroppiUtentiConnessi
AggiungiNomeUtente = False
End Function
Bene tutto ok!nel senso che un progetto di test
Option Explicit
Option Base 1
Dim CTEST As AccessoDati
Private Sub cmdAddNome_Click()
Dim t As String
Dim tObj As Object
t = InputBox("Nome utente", "?")
Set tObj = CTEST.EseguiSQL("gg", t)
End Sub
Private Sub cmdUtentiConnessi_Click()
Dim n As Long
Dim Connessi As Variant
List1.Clear
Connessi = CTEST.ChiConnesso
On Error Resume Next
    For n = 1 To UBound(Connessi)
        List1.AddItem Connessi(n)
    Next
On Error GoTo 0
End Sub
Private Sub Form_Load()
Set CTEST = New AccessoDati
End Sub
ECCO LA LAMERATA!!!
compilato l'exe e lanciato 2 volte....
bene se nel primo prog digito 2 utenti
"Pippo" "Pluto"....se premo sul tasto chi connesso vedo pippo e pluto....
se nel secondo exe in esecuzione aggiungo "Minnie" "Topolino"...mi
aspetterei che schicciando chi è connesso vedessi Pippo Pluto Minnie
Topolino...invece no!...ogni exe vede i suoi!
Ma scusate il riferimento al mio serverActivex non fa una istanza del
medesimo?...cioè i 2 exe non hanno a disposizione un puntatore alla mia dll?
e quindi lo spazio di memoria della dll non dovrebbero essere lo stesso per
tutti e 2 gli exe che la "puntano"?...che cavolo mi sfugge?
Ho provato a giocare su
MultiUse o GlobalMultiUse
e su
Persistable notPersistable....ma niente...forse non ho azzeccato la
combinazione giusta?...come fae per condividere un po di dati dentro la
dll....??? se mi dite scrivila in un db e nel registro di win...ma allora a
che serve?...butto via tutto e continuo come prima?...un bufferino nella dll
non c'è verso farlo? (mi risponderete...in c++ si in vb no?)...grazie...e
scusate la lamerata!
:-)

 Io ho il mio serverActiveX (dll)
L'errore è qui (non leggiamo nemmeno il resto :P )
Una dll è in-process, quindi... un processo = un'istanza della libreria (la
dll è come se fosse un pezzo del tuo exe).
Per fare quello che vuoi ti serve un ActiveX exe.
Funziona allo stesso modo, solo che è out-process, cioè è ingrado di vivere
di vita propria e allora sì che viene instanziato una volta sola (in realtà
puoi scegliere se fare in modo che ad ogni chiamata si istanzi un nuovo
ax-exe o usarne uno globale, ma ora non ricordo di preciso... è una delle 4
voci di proprietà del progetto).
Stai un po' attento anche al tipo di trheading (sempre nelle proprietà).
Per finire c'è un tipo di classe particolare a disposizione degli ax-exe: la
not-creatable.
Praticamente puoi instanziare una classe dall'interno ed esporre l'oggetto
(tramite proprietà di altra classe) in modo che le tue app siano costrette a
usare quella e non una nuova istanza.
Ciao


Grazie....scusa la domanda da lamerozzo che ha letto... ma ancora capito
poco!...
:-)

 ha scritto nel messaggio
news:yz429.166975$vm5.5...@news2.tin.it...

In aggiunta a quanto giustamente detto da Zanna considera anche questo:
Se non ho interpretato male la "m" di mChi, hai dichiarato
Private Const MAXUSER = 10
Private mChi() As String 'Max 10 connessioni
internamente alla classe; i membri pubblici e privati di una classe sono
relativi alle singole istanze della stessa, non sono ralativi all'intero
ActiveX e quindi non sono valori condivisi; in altre parole se istanzi tre
volte la tua classe AccessoDati avrai tre array mChi definiti, ciascuno
visibile solo nella specifica istanza, e questo anche con un componente out
of process.
Per ottenere quello che chiedi devi definire le informazioni comuni come
Public in un modulo BAS; non saranno comunque accessibili direttamente
dall'esterno ma solo tramite metodi wrapper forniti dalle classi (che e'
quello che vuoi) ma condivideranno i dati a livello di
intero progetto... le vituperate variabili globali, insomma.
Questo vale anche usando una classe PublicNotCreatable che ti e' stata
suggerita; per poter avere una singola istanza condivisa, la variabile
oggetto deve comunque essere dichiarata a livello di modulo, non altrove.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:aiathe$12p1bc$1...@ID-138791.news.dfncis.de...
Cut
Grazie!
