Newsgroup: it.comp.lang.c++
Titolo: Come usare oggetto COM

Salve,
ho una dll COM scritta in Visual C++,
riesco a utilizzarla tranquillamente in Visual Basic
ma ho qualche problema in Visual C++.
Leggendo l'SDK ho trovato che bisogna utilizzare
CoInitialize(...)
CoGetClassObject(...)
QueryInterface(...)
...
è possibile che per richiamare un semplice metodo devo scrivere
tutto quel codice???
ciao e grazie
tommaso
-- 
Posted from [212.97.43.82] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 tutto quel codice???
In generale per chiamare un funzione contenuta in una DLL la risposta
e' no.
Ma tu stai parlando di una DLL COM, e questa e' tutta un'altra cosa.
Ci sono molti modi di interagire con COM/OLE in C++, ma tecnicamente
questo non e' un argomento pertinente al linguaggio bensi' a COM/OLE
stesso. Pertanto siamo abbondantemente OT in questo gruppo. Comunque
guarda che l'uso di COM, se parti da zero, e' tutt'altro che banale
(salvo in VB che ti nasconde il tutto e quando chiami un metodo di un
oggetto COM/OLE genera automaticamente le 10 tonnellate di codice che
servono per farlo). Se hai MSDN hai praticamente tutta la
documentazione che ti serve. Salvo leggerla! Io quando decisi (qualche
anno fa) di approcciare COM impiegai un paio di mesi di studio per
arrivare a capire i fondamenti di come impostare il programma. Poi
circa altrettanto per riuscire a scrivere correttamente in C++ un
server COM (quello che tu chiami una DLL com) che fosse chiamabile
correttamente sia da VB che da C++ e, sempre in C++, un client COM che
richiamasse correttamente sia un server scritto in C++ che uno scritto
in VB. Ammetto pero' che il server COM che scrissi non si limitava a
creare un oggetto con qualche metodo, ma gestiva correttamente il
proxing COM, le chiamate asincrone, le callback, i reference count di
una foresta di oggetti che si referenziavano fra loro anche in maniera
circolare ed altre cosettine del genere.
Quindi non ti stupire se per instanziare un oggetto in un server com e
richiamare un suo metodo devi scrivere alcune decine di righe di
codice. Di fatto di rige di codice ne servono molte decine se non
alcune centinaia. Salvo che nel 90% dei casi, tutti i client COM
eseguono alcune sequenze di operazioni della lunghezza di parecchie
decine di linee di codice sempre uguali. Per esempio per creare un
oggetto devi prima capire di che calsse e', poi dato che non puoi
chiamare direttamente il costruttore, devi chiedere ad un oggetto
preesistente di crearlo per te. Quindi devi capire di che classe e'
l'oggetto che puo' creare l'oggetto che vuoi ottenere. Poi devi
cercare in una "directory" di oggetti preesistenti per ottenere un
riferimento a tale oggetto. Poi richiamare il giusto metodo etc. etc.
Dato che, nel 90% dei casi, tutte queste operazioni vengono eseguite
nello stesso modo e nello stesso ordine a partire da un piccolo
insieme di parametri, l'intera sequenza e' stata raccolta in una o
piu' funzioni. Come quelle chiamate CoQualcheCosa. E spera che il tuo
oggetto sia veramente COM e non OLE. Ovvero che i metodi siano vere
chiamate a una qualche interface e non a IDispatch. Altrimenti la sola
invocazione di un banale "A::f(int,long)" (per dirla in C++) richiede
qualche decina di linee!
Quindi per questo argomento passa ad un newsgroup sulla programmazione
in windows. E prima prova comunque a leggerti un paio di libri
sull'argomento. La domanda posta come la poni tu richiede molto piu'
di un e-mail per rispondere.