Newsgroup: it.comp.lang.visual-basic
Titolo: [!2] Threading Model per ActiveX DLL

Scusate tutti se ri-posto con cosě poco intervallo di tempo, ma sembra che
la mia domanda di questa mattina non sia stata capita.
Cerco di spiegarmi meglio.
Ho un ActiveX Dll
    ActiveX.vbp
    |
    +-- Class1
    +-- Class2
Ho 2 progetti esterni (mettiamo due EXE)
    Project1        Project2
Sia Progect1 che Progect2, al loro interno fanno questo
    [ -- Referenziano ActiveX -- ]
    Dim c1 as ActiveX.Class1
    Dim c2 as ActiveX.Class2
    Set c1 = new ActiveX.Class1
    Set c2 = new ActiveX.Class2 ' questo non dovrebbe servire
Ora, io voglio fare in modo che
    Project1.c1 e Project2.c1 si riferiscano a due istanze diverse di Class1
    Project1.c2 e Project2.c2 si riferiscano alla STESSA istanza di Class2
Se cioč faccio in Project1
    c2.value = 123
Quando in Project2 faccio
    Debug.Print c2.value
Voglio ottenere 123!
Non c'entrano niente classi pubbliche o private, si tratta solo di come
settare l'Apartment e il trheading model dell'ActiveX e delle sue classi.
E' possibile in VB?
Come?
Ciao


veramente č stata capita benissimo (almeno per quanto mi riguarda),i metodi
poi sono discutibili.
Il fatto che non puoi creare una classe a singolo thread dentro a un
contenitore multithread.
Il mio umile ocnsiglio appunto era quello di creare un secondo activex a
singolo thread e poi colloquiare ocn lo stesso tramite metodi alternativi
tipo sendmessage (se l'activex lo permette) oppurre dde o con metodo piů
rozzo winsock.
Per quanto riguarda i dati puoi passare un unica classe alla prima chiamata
dell'activex a singolo thread.Dopo ,appunto,con chiamate sendmessage o come
caspiterina preferisci richiamare funzioni interne .
ciao
--
-------
sito: 
www.dadev.it
ultime: Ocx per irc testi freeware
-------

 contenitore multithread.
Ma il mio ActiveX è già a singolo trhead!
Dovrò controllare bene.
Ciao.


credo che dovresti riguardare le risposte  sul thread che hai creato
precedentemente,le hai sottovalutate invece credo che facciano  proprio al
caso tuo (non mi riferisco alla mia  risposta ovviamente)



Mi sembra che la soluzione postata da Luca stamani faccia al caso tuo.
Tuttavia non sono sicuro che funzioni su una dll, dal momento che stiamo
parlando di componenti in-process, mentre la possibilità di usare una classe
"madre" che restituisca le istanze della "figlia" (praticamente una
connector) credo abbia successo solo su un activex exe, che vive comunque di
vita propria out-of-process...
Personalmente ho usato questo metodo solo su exe Activex, appunto.
Per una migliore trattazione, ti rimando all'esempio di Ms (coffee) da cui
cito:
 Connector class
 ---------------
 The Connector allows multiple clients to share a single
   CoffeeMonitor object.  The Connector class has its
   Instancing property set to MultiUse, so each client
   can create its own Connector.  Each of the Connector
   objects returns a reference to the single shared
   CoffeeMonitor object, so all the clients share the
   same CoffeeMonitor.  (See the CoffeeMonitor property,
   below.)
ciao
ugo

 Personalmente ho usato questo metodo solo su exe Activex, appunto.
[...]
confermo e sottoscrivo. Aggiungo che trattandosi di una dll E' IMPOSSIBILE
utilizzarla per scambiare dati tra due processi. Questo perchè ogni processo
agisce in uno spazio di memoria separato, ed essendo la dll in-process
utilizza per l'allocazione di memoria lo spazio di memoria del processo
chiamante. Quindi le dll create da due processi separati hanno una vtable
(la table che crea gli agganci tra handle e puntatori fisici alla memoria e
permette l'uso della memoria virtuale) diversa. Per gli activex exe il
discorso è tutto diverso, perchè hanno uno spazio di memoria proprio, e
quindi gli oggetti dichiarati nei moduli sono globali e possono essere
condivisi. La classe deve essere dichiarata multiuse, come specificava Luca
nell'altro thread. In generale questa non è una buona idea per condividere
dati tra applicazioni, perchè comporta dei problemi di sincronismo non
indifferenti, e grossi rischi di comportamenti indeterminati e, soprattutto,
quasi impossibili da debuggare. Se devi scambiare messaggi tra applicazioni
ci sono diversi metodi: pipe, mailslot, socket, solo per citarne alcuni.
Oppure se devi utilizzare la memoria usa la shared memory, che almeno ha dei
meccanismi di lock.
Altrimenti buona fortuna, ne hai davvero bisogno, perchè in presenza di un
errore riprodurre la sequenza di azioni che lo ha prodotto potrebbe essere
davvero complesso. ti consiglio di scrivere in un file data ora minuti e
secondi di ogni accesso alle variabili condivise, con il vecchio ed il nuovo
valore, almeno finchè non sei sicuro che il programma non sia VERAMENTE
stabile.
Ciao
Alfonso

 cito:
Concordo con Ugo ..
non credo sia possibile referenziarsi alla stessa classe da due progetti
diversi in quanto le dllActiveX vengono eseguite nello stesso spazio degli
indirizzi del progetto (per cui avresti una condivisione di spazi di
indirizzi in due progetti diversi).
In realtà anche con gli exeActiveX non sei in grado direttamente di creare
(tramite chiamata new) un riferimento alla classe, bensì devi farti
restituire il riferimento (tramite un metodo o una property) da una classe
già istanziata.
Zanna .. potresti spiegarci a cosa ti serve una diavoleria simile ... se non
ricordo male in "Programmare VB6" di Balena veniva fortemente sconsigliato
di procedere in questi termini in quanto "troppo difficile" da progettare
per una buon risultato.
Saluti

 vita propria out-of-process...
[SNIP]
Hai ragione,non funziona... prendo a prestito la "massima" di Antonio
nell'altro messaggio per fare ammenda a mia volta :-)
Infatti funziona sicuramente con un Exe ActiveX ma non con una DLL; questo
perche' impostare la DLL e' a thread singolo non vuol dire che tutte le
istanze, in assoluto, condividono lo stesso thread ma che tutte le istanze
*generate da un singolo client* condividono lo stesso thread (quello del
client appunto)
Si potrebbero mettere insieme le due cose e creare un wrapper Exe ActiveX
che espone una classe Connector che a sua volta restituisce la classe
condivisa della DLL...
Ciao
--
Luca Dormio
luca....@tin.it

 per una buon risultato.
Il tuo post mi ha illuminato :)
In effetti quello che volevo fare era un server ActiveX-exe.
Solo che mi piaceva di più un ActiveX dll :)
Comunque ho convertito tutto in Ax-exe e funziona (sembra) perfettamente.
Ciao