Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Type e array in DLL ActiveX

Lo so, la domanda č la stessa di quella di due post piů sotto.
Ho fatto un altro thread per non mescolare le mie considerazioni al post di
Mario con questa richiesta.
E' cosa nota (quasi) che VB non permette (e come potrebbe, poverino?) di
passare Array di Type come parametro di un membro di una classe in una DLL
ActiveX.
Cioč:
DLL_ActiveX.MyClass.MyMethod(pippo() As TMyType) ' << Errore di compilazione
Ora: č possibile forzare la cosa in qualche modo?
Ho provato con una classe di tipo MultiUse in una DLL Ax con Apartment
Threading (sono indeciso se convertirla in Single thread ma non penso
riguardi il mio problema).
Con la CopyMemory() non (sembra) funziona(re).
A quanto pare anche se la classe č in-process windows gioca un po' troppo
con le protezioni delle aree di memoria.
E' fondamentale per me riuscire a far passare quell'array senza conversioni
esterne (es. convertirlo in buffer di byte e poi passare questo alla sub).
E' possibile?
Grazie a tutti. Ciao


Mi sa che non ne esci.
Se trovi una soluzione, postala, perchč č un problema interessante e
sentito, ma temo non ci sia una via d'uscita...
ciao
ugo

 Grazie a tutti. Ciao
Ciao Zanna,
anche io ho spesso dovuto confrontarmi con problemi
analoghi; l'unica soluzione che ho trovato percorribile,
consiste nel sostituire l'array con una Collection.
Capisco che non e' una soluzione, ma solo un inganno,
tuttavia ritengo sia piu' sicuro dei CopyMemory e dei
Cast, Split etc. etc.
L'oggetto Collection e' parametro valido, accetta Item
di ogni tipo, la Redim è nascosta, ed è possibile 
trattarlo come un array.
È inoltre possibile creare Collection di Collection,
superando quell'odioso limite della Redim sugli array
multidimensionali.
HTH
Ciao
	Adriano


:-)
ciao
ugo

 multidimensionali.
anche io prima risolvevo usando una Collection al posto dell'array, ma
quando c'era un solo "membro". purtroppo attualmente mi servirebbe un array
di un tipo che abbia ben 4 membri... quindi secondo te come posso fare con
la Collection?
grazie.
Mario

 Capisco che non e' una soluzione, ma solo un inganno,
Più che altro è che il limite del Type rimane...
Niente array/collection di Type (almeno dalle mie prove). :(
Per ora ho risolto (posterò la soluzione) con la CopyMemory() in un modo
poco ortodosso, ma funzionante e tutto sommato semplice.
Ciao

 DLL_ActiveX.MyClass.MyMethod(pippo() As TMyType) ' << Errore di
compilazione
[SNIP]
Stiamo mica parlando di VB5?
Forse non ho capito io il problema, pero' in VB6 questo codice non solo
compila ma funziona anche:
'codice DLL (classe MyClass Multiuse)
'la dichiarazione di tipo va fatta Public nella *classe*
Public Type TMyType
    a As Integer
    b As String
End Type
Public Function MyMethod(udtArray() As TMyType, Index As Integer) As Integer
MyMethod = udtArray(Index).a
End Function
'codice applicazione client
Dim objTest     As DLL_ActiveX.MyClass
Dim x(2)        As DLL_ActiveX.TMyType
Set objTest = New DLL_ActiveX.MyClass
x(0).a = 0
x(1).a = 1
x(2).a = 2
Debug.Print objTest.MyMethod(x, 2)
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Mario
Ciao Mario,
solitamente definisco una classe che dichiara e definisce
i membri, nel tuo caso 4, e la utilizzo come elemento della
Collection, incapsulata a sua volta in una classe per la
quale riscrivo, wrap quindi, i metodi standard, 
Add/Item/Remove/Find etc.
Esempio:
MiaClasse.cls
Private m_Member1 As String
Private m_Member2 As Long
Private m_Member3 As String
....
Public Property Let/Set/Get per ognuno
MiaCollection.cls
Private m_colLocal   as Collection
Public Sub Add (ByRef objX As MiaClasse)
    Dim vKey  As string
    'Check statement for objx goes here
    'Key Constructor code goes here
    m_colLocal.Add objx, vKey
End Sub
Public Sub Item(vKey As Variant) As MiaClasse
  'Let Caller decide about Key: String or Ordinal
   On error goto lherror
   Set Item = m_colLocal.Item(vKey)
   exit sub
lherror:
   'Error handler code goes here
   Set Item = Nothing
End Sub
Public Property Count() As Long
  Count = m_colLocal.Count
End Property
etc. etc.
Spero di non aver astratto troppo e tu abbia inteso,
altrimenti chiedi ancora.
HTH
Ciao
	Adriano


I limiti al Type li risolvi con una classe(se ti 
interessasse leggi la mia risposta a Mario nel 3D).
Ho letto la soluzione che hai postato; in verita'
ti dico, anche io preferisco le soluzioni da bittarolo
d'altri tempi, che diciamolo gratificano enormemente l'ego.
Tuttavia, e te lo assicuro e sono sicuro tu gia' lo sappia, 
in ambienti produttivi, soprattutto quelli bancario-finanziari, 
non sono soluzioni proponibili.
Nemmeno a spiegare che, un codice quale il tuo, esplicita 
quanto spesso avviene in background ad opera del runtime.
Non viene considerato sicuro, affidabile, documentabile,
scalabile, manutenibile etc. etc.
E un fondo di ragione c'e', non lo si puo negare:
e' piu' semplice e breve modificare un Type se incapsulato
in una classe, di quanto sia modificarlo in un progetto
non strutturato.
Per non parlare delle imposizioni di CopyMemory sulle
dimensioni, nelle quali ti sei imbattuto.
Con stima
ciao
	Adriano

 interessasse leggi la mia risposta a Mario nel 3D).
[snip]
Questa volta devo ammettere la mia ignoranza :)
D'altra parte VB mi ha sempre sputato addosso a richieste di questo tipo,
quindi non mi sono nemmeno posto il problema.
In effetti quella proposta da Luca sembra funzionare, quindi credo che mi
affiderò al runtime di VB sperando che nelle prossime versioni funzioni e
allo stesso modo.
Ciao

Arj <A...@Arj.exe> wrote in message 3BDD7099...@Arj.exe...
ora provo...
Mario


Verissimo.
Mi cospargo il capo di cenere... :-)
Thnx
ciao
ugo