Newsgroup: it.comp.programmare.win32
Titolo: COM e ATL

Prima di ogni altra domanda vorrei consigli su un manuale online, o tutorial,
sul COM e come usarlo via ATL.
Ora, veniamo al dunque. Ho imparato alcune basi, sia dell'uno che dell'altra.
Ho creato un piccolissimo e semplicissimo oggetto ATL, basato sul Simple
Object, che non ha altro che una interfaccia da me definita IObjectOne che
aggiunge, oltre ai membri dell'interfaccia madre, un CiaoCiao();
La compilazione di questo oggetto funziona senza problemi, e viene anche
registrato nel sistema.
Poi ho creato un nuovo progetto, un programma MFC solo dialogo (è quello che
mi piace di più per fare le prove). Non riesco però a chiamare il metodo
CiaoCiao():
1) Inizializzo il COM con CoInitialize.
2) Faccio fare tutta la procedura d'istanziamento a CoCreateInstance, e gli
chiedo un puntatore a IObjectOne: per far ciò specifico il CLSID della mia
creazione COM e l'IID dell'interfaccia. Vedo che funziona, visto che
restituisce S_OK.
3) Tento di chiamare CiaoCiao(), ma non ci riesco perchè non so come
specificare che quel puntatore non è un puntatore a void ma a un'interfaccia
IObjectOne;
4) Vorrei chiame Release prima di chiudere il COM con CoUninitialize, per fare
la persona seria :-), ma non ci riesco per lo stesso problema.
Il fatto è che non riesco a includere, penso si faccia così, quel determinato
file .h che definisca IObjectOne*, in modo da potergli fare il deref con
pInterfaccia->CiaoCiao() o pInterfaccia->Release();
Già è stato complicato capire che nell'unico file .c del progetto ATL (non
capisco perchè non .h) c'erano i #define che corrispondevano ai vari GUID, e
io che pensavo dovevo riscrivere byte per byte a mano e con il copia e
incolla!
Inoltre, sono fortunato perchè io, che devo usare il mio oggetto COM, ho i
sorgenti di quell'oggetto che dicono com'è fatta ogni sua interfaccia. Se
volessi usare altri oggetti COM già esistenti, in Windows, chi mi da i file
sorgenti da includere nei miei programmi per definire i puntatori a
interfaccia come si deve?
Ringrazio Alex Martelli in anticipo per il suo sicuro intervento
chiarificatore :-)
--
Stefano Pettini
Risposte solo sul newsgroup, please.

 chiarificatore :-)
Prego!
Alex

 risorse di tipo TYPELIB nelle .EXE o .DLL che ti sta fornendo).
Ho visto che via uno dei tanti wizard di ATL è possibile creare interfacce
tramite Typelib che risiedono nel registro. Lui lo fa in modo che tu possa
creare un'interfaccia "compatibile" con una esistente. È possibile, in qualche
modo, fare la stessa cosa semplicemente in VC++ per estrarre dal registro la
descrizione dell'interfaccia che mi serve e metterla in un .h?
Altra cosa... una volta creato un oggetto non sono riuscito a trovare un
comando che mi ci aggiunga una seconda interfaccia vuota derivata da IUnknown
o IDispatch? Dove sta?


 o IDispatch? Dove sta?
Non sta.  Devi definire tu la "seconda interfaccia vuota" in un
modo o nell'altro (fai un oggetto fittizio poi lo togli, oppure
la copi-e-incolli a mano), poi compili l'IDL e avendo la typelib
chiedi la "implement interface" al wizard suddetto.
Alex

 sul COM e come usarlo via ATL.
Ti consiglio di vedere 
http://www.sente.ch/cetus/oo_ole.html
 (Cetus Link)
per
un' enorme lista di tutorials.
In particolare, per partire da zero e lavorare sul COM in C++ nudo ti
consiglio
http://msdn.microsoft.com/workshop/components/com/tutorial/download.asp
Dove troverai un tutorial (Microsoft :-( ) da scaricare in un file singolo.
Ciao e buon lavoro.

 chiedi la "implement interface" al wizard suddetto.
Che cosa complessa. Perchè non hanno pensato a un semplice "Add Interface
wizard"?


 Interface wizard"?
Mah, non so, forse perche` e` cosi` facile farlo a mano (e l'ATL
e` pensata per sviluppatori esperti) che non hanno pensato di
dover "guidare" la gente anche in questo.  In altri termini,
la maggior parte dei Wizard ATL sono pensati per fare in fretta
qualcosa che a mano richiederebbe piu` sforzo, piuttosto che
non per facilitare la vita ai principianti.
Alex

 In particolare, per partire da zero e lavorare sul COM in C++ nudo
No, grazie, non mi va :-)


 No, grazie, non mi va :-)
Certo non e` quello che si vuol fare nella realta`, ma da
un punto di vista didattico puo` essere interessante farlo
una volta nella vita;-).
Nello stesso spirito, nel mio tutorial sulle API Win32 (alla
solita pagina 
http://aleax.supereva.it/
, ogni tanto, di solito
nei weekend, lo aggiorno...:-) ho messo un esempio di uso
di COM _dal C_ (senza ++)...:-).
Alex