2010-04-27 2 views
5

sto facendo alcune cose legate COM con DirectShow come ad esempio:Consigli quando si utilizza di oggetti COM/CComPtr e l'STL

typedef CComPtr<IBaseFilter> AutoIBaseFilterPtr; 
map<CString, AutoIBaseFilterPtr> _filterMap; 

per memorizzare un elenco di oggetti COM relativi DirectShow e il loro nome descrittivo.

Dopo aver trovato this article (See:Problem 2) su come le modifiche nel compilatore VC10 potrebbero avere effetto sul codice OK, mi chiedo se ci siano altre cose da tenere a mente quando si mescolano STL e CComPtr o si tratta solo di mixare STL e COM in generale.

Eventuali suggerimenti sarebbe molto apprezzato, grazie

+2

Grazie per il link a questo articolo. – sharptooth

+0

Ho pensato che 'CAdapt' era raccomandato o addirittura necessario per il bridging ATL STL <-> per un po 'di tempo? –

+0

Sono ancora un po 'nuovo alla COM quindi non ero a conoscenza dell'uso di CAdapt con la STL ma guardandolo, sì, sembra che sia raccomandato ma immagino ci siano molte persone là fuori che potrebbero avere una brutta sorpresa quando si tenta di compilare il loro programma sotto VC10. La mia domanda è mirata a scoprire più casi in cui potrei cadere in una trappola cattiva. Grazie per il tag anche modifiche btw. – Andrew

risposta

2

L'unica cosa leggera mi viene in mente che non è stato detto è che CAdapt è richiesto per CComBSTR così come CComPtr, perché sovraccarica operator& troppo.

In realtà, si sta sovraccaricando operator& che rende CAdapt necessario, come molti contenitori STL richiedono che prendere l'indirizzo di qualcosa X restituisce un puntatore a detto X.

+0

Contrassegnato come risposta, anche se la mia domanda era di open ended, sei l'unico a rispondere :) – Andrew

+3

'CAdapt' non è più richiesto per' CComPtr' né 'CComBSTR' per tutti i contenitori STL e la maggior parte degli algoritmi STL in VC2010 RTM. Questo perché ora usa 'std :: addressof' (una cosa nuova in C++ 0x) piuttosto che applicare' operator & 'direttamente per ottenere l'indirizzo di oggetto, e quella funzione di helper funziona attorno a qualsiasi operatore' sovraccarico ', e fornisce sempre il puntatore attuale. –

+0

Pavel; grazie per le informazioni aggiunte, non ho ancora esaminato VS2010. Ho bisogno di leggere su std :: addressof - sembra interessante! –