Diseño de plugins en C y C++

89 views
Skip to first unread message

Joaquin Duo

unread,
Nov 16, 2011, 1:16:53 AM11/16/11
to cp...@googlegroups.com
Hola lista:

He estado leyendo sobre diseño de arquitecturas de plugins en C y C++. Más especificamente me interesan los plugins para programas multimedia (fotografía, video, 3d), como por ejemplo GIMP, Photoshop, Premier , 3D Studio Max, Maya... etc.
He encontrado lo siguiente:
1- Las librerías Poco
http://pocoproject.org/
http://pocoproject.org/slides/120-SharedLibraries.pdf
2- Un artículo sobre C++
http://www.nuclex.org/articles/5-cxx/4-building-a-better-plugin-architecture

Qué libro/link sobre el tópico me recomendarían? Qué experiencias tienen al respecto?

Gracias de antemano. ;-)
(muy buena la lista)
Joaquín

Enrique Nieloud

unread,
Nov 16, 2011, 6:23:38 AM11/16/11
to cp...@googlegroups.com
Hola Joaquín,

Me da la impresión que estás agarrando el problema por donde no es, en
el siguiente sentido:
Poco Project es una librería C++ de propósito general, que en sí misma
"poco" tiene que ver con la creación de plugins para PhotoShop, Maya
3D, etc.
Mientras que la docu que mandaste tiene que ver con facilidades
multiplataforma que provee la librería "Poco" para cargar
dinámicamente librerías ".dll" en windows, y ".so" en unixes y afines.

Encará el problema más por el lado de investigar cómo se hace un
plugin para el software que te interesa en particular, el caso más
clásico, y seguramente mejor documentado es el de Adobe PhotoShop.

No va a existir un plugin universal que sea entendido por todos los
otros softwares, cada software tiene su protocolo. Dicho esto, te
aclaro que los plugins de PhotoShop son "cuasi"-standard en el sentido
que muchos otros softwares que no son de Adobe se pueden comunicar con
plugins de PhotoShop.

Para arrancar con PhotoShop, tenés esto:

http://www.adobe.com/devnet/photoshop/sdk.html

Si usás Mac OS X, viene con proyectos listos para compilar en XCode,
mientras que si usás Windows, viene con proyectos listos para usar en
Visual Studio .
Listos, significa que compilás y te produce el plugin.
Fijate.

saludos,

- Enrique
2011/11/16 Joaquin Duo <joa...@gmail.com>:

> --
> ¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido
> este mesaje por error.
> En caso de duda visita "http://groups.google.com/group/cppba"

Pablo Ybalo

unread,
Nov 16, 2011, 8:22:46 AM11/16/11
to cp...@googlegroups.com
Hola, bienvenido a la lista!

No se exactamente que estás buscando, pero en términos generales,
puede que te resulte interesante "The Software Architecture of the
GIMP" [1]

En la práctica, si la idea es reutilizar plugins de terceros, hay
algunos temas que pueden hacer una arquitectura inutilizable por lo
que te recomiendo que tengas muy en cuenta los requerimientos no
funcionales. Algunos que limitaron mis opciones en un proyecto que
trabajé fueron:
- la compatibilidad binaria 32 vs 64 bits
- tamaño de las imágenes
- la mayoría de las APIs son estilo C con todo lo bueno y lo malo que
ello implica, pero las hay tambien en C++, managed .NET, etc
- como manejan situaciones inesperadas como crashes, timeouts, excepciones.
- la posibilidad de utilizar la GPU, las ganancias en performance son tremendas.

Por último, creo que video e imagenes son arenas muy diferentes. Si
nos contás un poco más del proyecto por ahí te podamos aportar algo
más concreto. Saludos!

--Pablo Ybalo

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.84.7715

Daniel Gutson

unread,
Nov 16, 2011, 8:28:14 AM11/16/11
to cp...@googlegroups.com
Hola,
  no leí los comentarios anteriores, ni tampoco mucho tu correo, pero creo:
 a) que a vos no te interesa tanto cómo arquitecturar extensibilidad en un sistema, osea, no es que querés diseñarle a un sistema soporte para plugins, sino que te interesa hacer plugins nuevos a un sistema que ya soporta, correcto?
 b) en tal caso, creo que los links q pusiste no te sirven; te sirve entender cómo hacer un plugin específico, y en tal caso te puedo dar una explicación (estoy creando unplugged.googlecode.com), pero antes decíme para qué plataforma para hacerlo un poco más específico.


2011/11/16 Pablo Ybalo <pyb...@gmail.com>
--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"



--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

Joaquin Duo

unread,
Nov 16, 2011, 10:40:18 PM11/16/11
to cp...@googlegroups.com
Gracias por sus respuestas!

Detallo más lo que estoy buscando. Mi interés primario es desarrollar un programa que soporte plugins, el programa sería multimedia, por lo que debería soportar plugins para imágenes, videos, audio y 3d. (** más sobre el programa abajo)

Sobre mi consulta en la lista: Quería saber si conocían algúna bibliografía o documento que trate el tema en manera general.(si es que tal bibliografía existe) Digamos, alguien que haya investigado sobre los plugins y haya llegado a un par de recetas, recomendaciones y patrones.
 
Mi intención no es desarrollar plugins para otros programas, sin embargo me interesa saber cómo los han diseñado y poder sacar pro y contras de cada uno de los diseños, además me gustaría conocer sus opiniones si los han usado.

Les comento de los sistemas de plugins que he investigado hasta ahora:
1- K-3D, programa de modelado 3D (interface en C++) http://k-3d.org
2- Gegl , futuro nucleo de plugins de Gimp (interface en C) http://gegl.org

(**) El objetivo es que el programa sea multiplataforma, pero las primeras pruebas las pienso hacer en Linux. Además los plugins se conectarían en un grafo de nodos: Algunos ejemplos de programas:
1- K-3D, llama "Pipeline" al grafo (http://www.k-3d.org/wiki/Visualization_Pipeline)
2- Lumiera (http://lumiera.org/documentation/user/intro/intro.html ver sección "Rendering is Graph Processing" el esquema http://lumiera.org/documentation/devel/images/lumiera_big_graph.png). )
3- Gegl http://gegl.org/#features


On Wed, Nov 16, 2011 at 10:28 AM, Daniel Gutson <daniel...@gmail.com> wrote:
Hola,
  no leí los comentarios anteriores, ni tampoco mucho tu correo, pero creo:
 a) que a vos no te interesa tanto cómo arquitecturar extensibilidad en un sistema, osea, no es que querés diseñarle a un sistema soporte para plugins, sino que te interesa hacer plugins nuevos a un sistema que ya soporta, correcto?
 b) en tal caso, creo que los links q pusiste no te sirven; te sirve entender cómo hacer un plugin específico, y en tal caso te puedo dar una explicación (estoy creando unplugged.googlecode.com), pero antes decíme para qué plataforma para hacerlo un poco más específico.

Daniel:
Si estás diseñando o ya diseñaste un sistema de plugins podemos compartir ideas al respecto.
 

Daniel Gutson

unread,
Nov 16, 2011, 10:47:55 PM11/16/11
to cp...@googlegroups.com
Joaquín,

   sí o sí necesito terminar este unplugged en breve; cuando esté, te lo comento, o lo comento acá en la lista.

Ya hicimos dos sistemas que requerían plugines, y ahora vienen más, así q voy a meter en un lugar "común" lo común de la mecánica de plugines para que sea reutilizable.

Consejo: no te pierdas en detalles, vos hacé lo q quieras hacer, y después ves lo de los plugines. No es nada del otro mundo. Simplemente primero pensá una clase Plugin, para que todo plugin la implemente. Una clase plugin tiene dos partes: la comunicación plugin->framework, y la comunicación framework->plugin:

class Plugin
{
    protected:  // comm. plugin -> framework
        void plugin_api_1();
        void plugin_api_2();

    public: // comm. framework -> plugin
        virtual void event1() = 0;
        virtual void event2() = 0;
};

class MyPlugin : public Plugin
{
    private:
        virtual void event1()
        {
            plugin_api_1();
            ...
        }

        virtual void event2()
        {
            plugin_api_1();
            plugin_api_2();
            ...
        }

};


2011/11/17 Joaquin Duo <joa...@gmail.com>

Daniel Gutson

unread,
Nov 16, 2011, 11:00:52 PM11/16/11
to cp...@googlegroups.com
Para hacerlo más concreto, invento un ejemplo, y creo q esto es todo lo q te puedo ayudar xq estoy desesperadamente ocupado...


class Plugin
{
    protected:
        void draw_circle( Coord x, Coord y, unsigned int radious, Color color, bool solid );
        void draw_line( Coord x1, Coord y1, Coord x2, Coord y2, Color color, bool solid );
        void get_screen_size( unsigned int& width, unsigned int& height, unsigned int& color_depth);

    public:
        virtual void initialization_event() = 0;
        virtual void render_event(unsigned int time) = 0;
};

class SomePlugin : public Plugin
{
        unsigned int space_between;
    private:
        virtual void initialization_event()
        {
            unsigned int dummy_colors;
            unsigned int width, height;
            get_screen_size( width, height, dummy_colors );
            space_between = min( width, height) / 10;
        }

        virtual void render_event(unsigned int time)
        {
            const unsigned int circle_number = time % 10;
            const Coord pos = circle_number * space_between;
            draw_circle( pos, pos, 10, Colors::Red, false );
        }
};

2011/11/17 Daniel Gutson <daniel...@gmail.com>

Fernando Cacciola

unread,
Nov 16, 2011, 11:01:31 PM11/16/11
to cp...@googlegroups.com
Hola Joaquin,

Como est�s tanto tiempo?

En la lista de boost una vez apareci� esto:

http://dynobj.sourceforge.net/

Y esto otro:

http://groups.google.com/group/boost-developers-archive/browse_thread/thread/508339c156efe781/3ea8c6cd938f42b1?lnk=gst&q=plugin#3ea8c6cd938f42b1


Tal vez te sirva.

Saludos

--
---
Fernando Cacciola
SciSoft Consulting, Founder
http://www.scisoft-consulting.com

Joaquin Duo

unread,
Nov 16, 2011, 11:55:57 PM11/16/11
to cp...@googlegroups.com
Gracias por el ejemplo!

Joaquin Duo

unread,
Nov 17, 2011, 12:00:04 AM11/17/11
to cp...@googlegroups.com


On Thu, Nov 17, 2011 at 1:01 AM, Fernando Cacciola <fernando...@gmail.com> wrote:
Hola Joaquin,
Hola Fer!
 

Como estás tanto tiempo?

En la lista de boost una vez apareció esto:

http://dynobj.sourceforge.net/
Justo lo que andaba buscando de C++, porque es una de las cosas en las que tenía duda, el tema del name mangling y el linkeo a la hora de cargar librerías.
 

También me interesaba el tema del linkeo estático, pero un poco más tangencialmente. Así que le voy a dar una mirada después.
 
Muchas gracias!

Alejandro Santos

unread,
Nov 17, 2011, 9:21:13 AM11/17/11
to cp...@googlegroups.com
El día 17 de noviembre de 2011 00:40, Joaquin Duo <joa...@gmail.com> escribió:
>
> Sobre mi consulta en la lista: Quería saber si conocían algúna bibliografía
> o documento que trate el tema en manera general.(si es que tal bibliografía
> existe) Digamos, alguien que haya investigado sobre los plugins y haya
> llegado a un par de recetas, recomendaciones y patrones.
>

Hablando en términos de patrones de diseño de objetos, un plugin es un
Strategy. Si necesitás algo un poco más complicado vas a estar usando
un Observer. También vas a necesitar un Abstract Factory, Builder y/o
Factory Method para crear las instancias de tus objetos.

--
Alejandro Santos

Federico J. Fernández

unread,
Mar 28, 2012, 8:34:09 AM3/28/12
to cp...@googlegroups.com
Joaquin,

Hace un tiempo colabore en el desarrollo de esta libreria que aun esta en el sandbox de Boost:

http://boost-extension.redshoelace.com/docs/boost/extension/index.html

Fijate que quiza podes sacar algun concepto de ahi.

--
fede

Daniel Gutson

unread,
Mar 28, 2012, 8:41:13 AM3/28/12
to cp...@googlegroups.com
nosotros tenemos algo también para esto:

  unplugged.googlecode.com

2012/3/28 Federico J. Fernández <federico....@gmail.com>

--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"

Joaquin Duo

unread,
Mar 29, 2012, 10:51:18 PM3/29/12
to cp...@googlegroups.com
On Wed, Mar 28, 2012 at 9:34 AM, Federico J. Fernández <federico....@gmail.com> wrote:
Joaquin,

Hace un tiempo colabore en el desarrollo de esta libreria que aun esta en el sandbox de Boost:

http://boost-extension.redshoelace.com/docs/boost/extension/index.html
Gracias por el dato! Tengo que revisarlo.
Ahora voy a empezar otro thread sobre una duda relacionada con este tema.


Reply all
Reply to author
Forward
0 new messages