2010-09-07 16 views

Respuesta

3

Los desarrolladores son flojos y prefieren las cosas que son más fáciles que las cosas difíciles, y ATL se diseñó para facilitar el desarrollo de COM.

En la mayoría de los casos ATL se encarga de muchos de los detalles desordenados del desarrollo COM, como la gestión QueryInterface, el recuento de referencias y la administración de por vida, y todos los diversos modelos de subprocesamiento compatibles con COM. También proporciona soporte integrado para cosas como interfaces duales, puntos de conexión, enumeradores, etc.

Si no usa ATL, o algo así, estará escribiendo mucho más código. Eso sería desafortunado;)

Editar:

No voy a escribir ningún código COM sin ATL para un ejemplo porque es tan terrible para hacerlo, pero echa un vistazo a esto:

http://www.codeproject.com/KB/COM/simplecomserver.aspx

Descargar eso y luego ver los siguientes archivos en el marco del proyecto simplecomserver:

registry.cpp

simplecomserverImpl.cpp

(alrededor de 700 líneas de código)

Ahora imagina que en lugar de escribir toda esa monstruosidad, se podría derivar una clase de CCoComClass y simplemente poner en práctica el método Nombre, y luego hacer esto para manejar creación de instancias y registro de clases:

// 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

¿Puedes dar un ejemplo? – wamp

+0

¿Un ejemplo de qué? – Gerald

+0

¿Usar ATL para facilitar el desarrollo? – wamp

7

Parece que quiere algunos ejemplos concretos de dónde ATL simplifica la programación COM; los siguientes son lo que se me ocurrió.

  • CComObjectRootEx: Mediante la derivación de sus clases COM de CComObjectRootEx, se obtiene flujos seguros de conteo de referencias de forma gratuita.

  • CComCoClass: Esta clase base implementa todos los métodos para crear instancias de la clase, incluyendo la materia IClassFactory que se requiere para que los clientes utilicen CoGetClassObject con su componente.

  • COM_INTERFACE_ENTRY macros: ATL ofrece un montón de macros para utilizar entre BEGIN_COM_MAP y END_COM_MAP, que se puede utilizar para implementar las tripas de IUnknown::QueryInterface de la manera correcta para sus necesidades, sean las que sean.

  • IDispatchImpl: Si desea que sus componentes sean accesibles para la secuencia de comandos, debe implementar IDispatch. ATL proporciona la clase IDispatchImpl, lo que ahorra la molestia de implementarlo usted mismo.

  • CComPtr/CComQIPtr: ATL proporciona estas clases de puntero inteligente, que encapsulan las llamadas a IUnknown::AddRef, IUnknown::Release y IUnknown::QueryInterface.Su uso hará que su código sea más fácil de leer y menos propenso a los errores de conteo de referencias COM.

  • CComBSTR/CComVariant: ATL proporciona estas clases, que reducen la complejidad de tratar con los tipos COM BSTR y VARIANT.

+0

¿Qué archivos de cabecera/bibliotecas necesito incluir para usar ATL? – wamp

+1

Eso suena como una pregunta separada ..... :) –

+0

¿Todavía necesito llamar a 'CoInitialize (NULL)' y 'CoUninitialize()' si cambio a ** ATL **? – wamp

Cuestiones relacionadas