¿Puede proporcionar un ejemplo que a través de la comparación muestre la ventaja de ATL?¿Por qué las personas usan ATL para la programación COM?
Respuesta
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;
}
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 deCComObjectRootEx
, 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 materiaIClassFactory
que se requiere para que los clientes utilicenCoGetClassObject
con su componente.COM_INTERFACE_ENTRY
macros: ATL ofrece un montón de macros para utilizar entreBEGIN_COM_MAP
yEND_COM_MAP
, que se puede utilizar para implementar las tripas deIUnknown::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 implementarIDispatch
. ATL proporciona la claseIDispatchImpl
, lo que ahorra la molestia de implementarlo usted mismo.CComPtr
/CComQIPtr
: ATL proporciona estas clases de puntero inteligente, que encapsulan las llamadas aIUnknown::AddRef
,IUnknown::Release
yIUnknown::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 COMBSTR
yVARIANT
.
- 1. pixel.gif, ¿por qué las personas lo usan?
- 2. ¿Por qué las personas usan jQuery para operaciones básicas?
- 3. ¿Por qué las personas usan linq en sql?
- 4. ¿Por qué las personas usan la expresión regular para el correo electrónico y otras validaciones complejas?
- 5. ¿Por qué las personas no usan LabVIEW para otros propósitos que no sean la adquisición de datos y la virtualización?
- 6. HTML5: ¿Por qué las personas no usan "ContentEditable" para sus sitios web Comentario de entrada?
- 7. ¿Por qué las personas usan Puppet/Chef con Amazon Cloud Formation en lugar de usar CloudInit?
- 8. ¿Por qué las personas usan Command-line en lugar de IDE?
- 9. ¿Por qué las personas usan __ (doble guión bajo) tanto en C++
- 10. ¿Por qué las personas usan valores de magia en lugar de nulo en su código?
- 11. ¿Por qué las personas usan enumeraciones en C++ como constantes mientras pueden usar const?
- 12. ¿Qué técnicas/estrategias usan las personas para construir objetos en C (no en C++)?
- 13. ¿Qué hosting usan normalmente las personas para publicar el sitio web de Django?
- 14. ¿Por qué algunas personas usan "Ninguno" como miembro de la enumeración?
- 15. ¿Por qué algunas personas usan el método de clase # en lugar de Class.method en la correspondencia?
- 16. ¿Por qué las personas siempre usan la reasignación de variables de instancia en Objective-C (es decir, iPhone)?
- 17. ¿Por qué las personas usan bouncycastle en lugar del proveedor JCE integrado de Java? ¿Cuál es la diferencia?
- 18. Manejo de eventos COM en C++ (ATL, MFC o C++ puro) para la interoperabilidad de Java
- 19. ¿Por qué no más personas usan emacs con el modo víbora?
- 20. ¿Por qué las plantillas django simplemente usan el código python?
- 21. ¿Por qué razones las personas eligen Ruby sobre Java?
- 22. Pthread: ¿Por qué las personas se molestan en utilizar pthread_exit?
- 23. ¿Por qué las personas llaman a jQuery $ alias 'fábrica'?
- 24. ¿Por qué las personas siguen creando fuentes RSS?
- 25. ¿Por qué algunas personas usan 'if has ("gui_running")' en un .gvimrc?
- 26. ¿Por qué las personas definen objeto extiende su clase compañera?
- 27. ¿Por qué a las personas scala no les gusta la anotación?
- 28. ¿Por qué debería aprender COM?
- 29. ¿Por qué se usan clases de amigos para la validación?
- 30. ¿Por qué java applets/javafx no se usan ampliamente? (por qué no debería usarlos para RIA)
¿Comparación con qué? – Johnsyweb
Para no usar ATL. – wamp