2010-09-07 15 views

risposta

3

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; 
} 
+0

Puoi fornire un esempio? – wamp

+0

Un esempio di cosa? – Gerald

+0

Utilizzo di ATL per facilitare lo sviluppo? – wamp

7

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 da CComObjectRootEx, 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 roba IClassFactory che è necessario per i clienti di utilizzare CoGetClassObject con il componente.

  • COM_INTERFACE_ENTRY macro: ATL offre tutta una serie di macro da utilizzare tra BEGIN_COM_MAP e END_COM_MAP, che può essere utilizzato per implementare il coraggio di IUnknown::QueryInterface nel modo corretto per le vostre esigenze, qualunque esse siano.

  • IDispatchImpl: Se si desidera che i componenti siano accessibili allo script, è necessario implementare IDispatch. ATL fornisce la classe IDispatchImpl, che salva la seccatura di implementarlo da solo.

  • CComPtr/CComQIPtr: ATL fornisce queste classi di puntatore intelligente, che incapsulano le chiamate verso IUnknown::AddRef, IUnknown::Release e IUnknown::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 COM BSTR e VARIANT.

+0

Quali file/librerie di intestazione devo includere per usare ATL? – wamp

+1

Sembra una domanda a parte ..... :) –

+0

Devo ancora chiamare 'CoInitialize (NULL)' e 'CoUninitialize()' se passo a ** ATL **? – wamp

Problemi correlati