Potete fornire un esempio che attraverso il confronto mostra il vantaggio di ATL?Perché le persone usano ATL per la programmazione COM?
risposta
Gli sviluppatori sono pigri e preferiscono cose facili su cose difficili, e ATL è stato progettato per facilitare lo sviluppo COM.
Nella maggior parte dei casi, ATL si occupa di molti dettagli disordinati dello sviluppo COM, come la gestione di QueryInterface, il conteggio dei riferimenti e la gestione della durata e tutti i vari modelli di thread supportati da COM. Fornisce anche supporto integrato per cose come dual-interface, punti di connessione, enumeratori, ecc.
Se non si utilizza ATL, o qualcosa del genere, si scriverà molto più codice. Sarebbe un peccato;)
Edit:
Non ho intenzione di scrivere alcun codice COM senza ATL per un esempio, perché è così orrendo di farlo, ma controlla questo:
http://www.codeproject.com/KB/COM/simplecomserver.aspx
Scarica questo e poi guardare i seguenti file nell'ambito del progetto simplecomserver:
registry.cpp
simplecomserverImpl.cpp
(circa 700 linee di codice)
Ora immaginate che invece di scrivere tutto di quella mostruosità, si potrebbe derivare una classe da CCoComClass e solo implementare il metodo nome, e poi fare questo da gestire istanza di classe e registrazione:
// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
return _AtlModule.DllCanUnloadNow();
}
// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
// registers object, typelib and all interfaces in typelib
HRESULT hr = _AtlModule.DllRegisterServer();
return hr;
}
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _AtlModule.DllUnregisterServer();
return hr;
}
Sembra che vogliate alcuni esempi concreti di dove ATL semplifica la programmazione COM; quello che segue è quello che mi è successo.
CComObjectRootEx
: Derivando vostre classi COM daCComObjectRootEx
, si ottiene thread-safe di conteggio dei riferimenti gratuitamente.CComCoClass
: Questa classe di base implementa tutti i metodi per istanziare la classe, tra cui la robaIClassFactory
che è necessario per i clienti di utilizzareCoGetClassObject
con il componente.COM_INTERFACE_ENTRY
macro: ATL offre tutta una serie di macro da utilizzare traBEGIN_COM_MAP
eEND_COM_MAP
, che può essere utilizzato per implementare il coraggio diIUnknown::QueryInterface
nel modo corretto per le vostre esigenze, qualunque esse siano.IDispatchImpl
: Se si desidera che i componenti siano accessibili allo script, è necessario implementareIDispatch
. ATL fornisce la classeIDispatchImpl
, che salva la seccatura di implementarlo da solo.CComPtr
/CComQIPtr
: ATL fornisce queste classi di puntatore intelligente, che incapsulano le chiamate versoIUnknown::AddRef
,IUnknown::Release
eIUnknown::QueryInterface
.Usarli renderà il tuo codice più facile da leggere e meno incline a bug di conteggio di riferimento COM.CComBSTR
/CComVariant
: ATL fornisce queste classi, che riducono la complessità di trattare con i tipi COMBSTR
eVARIANT
.
- 1. Perché le persone usano ProjectData
- 2. pixel.gif, perché le persone lo usano?
- 3. Perché le persone non usano i tetraedri per le skybox?
- 4. Perché le persone usano Command-line invece di IDE?
- 5. Perché le persone usano i = i + 1 invece di i ++?
- 6. Perché le persone non usano <CFLOGIN>?
- 7. In che modo le persone usano Yeoman?
- 8. Perché le persone usano bouncycastle invece del provider JCE integrato in Java? Qual è la differenza?
- 9. Capire quante persone usano il mio software
- 10. Enumera i metodi dell'oggetto COM (IDispatch) utilizzando ATL?
- 11. C++ perché le persone non usano maiuscole nel nome dei file di intestazione?
- 12. Che modalità usano le persone quando usano Emacs per modificare pagine Web che contengono CSS, javascript e HTML?
- 13. Quale hosting normalmente usano le persone per pubblicare il sito Web Django?
- 14. Quali tecniche/strategie usano le persone per costruire oggetti in C (non C++)?
- 15. Esercitazioni di programmazione per persone con esperienza zero
- 16. Perché alcune persone usano il metodo Class # invece di Class.method nella corrispondenza?
- 17. Perché dovrei imparare COM?
- 18. Migliorare le immagini per persone daltonici
- 19. JavaScript Speech-to-Text per le persone non vedenti
- 20. Perché le persone minificano css e javascript, quando abbiamo gzip?
- 21. Le buone maniere per la programmazione C
- 22. Le fabbriche astratte usano "nuovo"?
- 23. Perché le persone utilizzano il parametro proprietario predefinito su Nessuno in __get__?
- 24. È il codice per i computer o per le persone?
- 25. OpenGL - Perché lo stack matrix è stato rimosso e cosa stanno usando le persone adesso?
- 26. Algoritmo migliore per invitare le persone a festeggiare
- 27. Perché le persone aggiungono la propria cartella al percorso di inclusione standard?
- 28. vogliono migliorare le abilità matematiche per la programmazione
- 29. HTML5: perché le persone non utilizzano "ContentEditable" per i loro siti Web?
- 30. Le CTE usano spazi in tempdb?
Confronto con cosa? – Johnsyweb
Per non utilizzare ATL. – wamp