via sistema resumen regulacion membrana lectinas las inmunologia complemento complejo clasica ataque alterna c++ c plugins

resumen - Implementación de un sistema de complemento en C o C++



via clasica del complemento (11)

¿Cuáles son sus consejos sobre la implementación de un sistema de estilo de complemento?


En C (y creo que C ++ también, aunque no lo he hecho yo mismo), esto generalmente se hace usando módulos cargados dinámicamente. Las API: s para tales son dependientes de la plataforma.

En POSIX (Linux), utiliza la familia de funciones dlopen() . Básicamente construye su complemento por separado, luego lo carga en tiempo de ejecución, busca sus símbolos por su nombre y puede llamarlos.

Para Win32, hay LoadLibrary() que hace algo muy similar, construyes tu código en una DLL.

Para una envoltura práctica que hace que todo esto sea fácil y transparente, consulte la API GModule de GLib.


En el marco de tiempo ''92 / ''93 trabajé en una arquitectura de complemento para Aldus PageMaker, que se codificó en C ++. PageMaker se creó en un marco de C ++ OOP llamado VAMP, que ayudó a su portabilidad entre Mac OS y Windows.

Así que tratamos de usar las características de C ++ para construir una arquitectura de complemento. Esto resultó ser muy problemático para las clases de C ++ debido al llamado problema de clase de base frágil. Procedí a escribir un artículo que se publicó en revistas y que presenté en OOPSLA ''93 en un taller de reflexión. También me puse en contacto con Bjarne Stroustrup en una conferencia de Usenix en Portland y procedí a dialogar con él durante varios meses, donde defendió el problema de lidiar con el problema de la clase base frágil en mi nombre. (Por desgracia, otros problemas se consideraron más importantes en ese momento).

Microsoft introdujo el sistema COM / DCOM y para esa plataforma que se consideró como una solución viable al problema. C ++ podría utilizarse como lenguaje de implementación para COM a través de clases abstractas utilizadas para definir interfaces COM.

Sin embargo, estos días los desarrolladores evitan COM / DCOM.

Por el contrario, NeXT ideó una arquitectura de complementos utilizando Objective C a principios de los 90 en el marco NeXT Step. Hoy en día vive de forma vibrante en Mac OS X en las computadoras de Apple y en plataformas importantes como el iPhone.

Presento Objective C habilitado para resolver el problema del complemento de una manera superior.

Personalmente, considero que el problema de clase base frágil de C ++ es su defecto más fatal.

Si se construyera una arquitectura de complemento con la familia de lenguajes basada en C, lo haría usando Objective C.


He escrito un artículo sobre cómo implementar un sistema de complemento usando bibliotecas de enlace dinámico. El artículo está escrito desde el punto de vista de un programador de Windows, pero la técnica se puede aplicar a un entorno de tipo Linux / Unix.

El artículo se puede encontrar aquí: http://3dgep.com/?p=1759

El punto principal es que debe crear una DLL "común" que esté implícitamente vinculada tanto por la aplicación principal (la aplicación principal) como por las implementaciones de los complementos. A continuación, la aplicación central puede vincular y cargar dinámicamente los complementos en tiempo de ejecución.

El artículo también muestra cómo puede compartir de forma segura la instancia estática (singleton) de una clase en varias DLL mediante el uso de la DLL "común".

El artículo también muestra cómo se puede exportar una función o variables "C" de una DLL y usar las funciones exportadas en la aplicación en tiempo de ejecución.


He escrito una biblioteca de complementos Pugg que carga clases de C ++ desde archivos dll y aquí está la lógica que utilicé:

El usuario exporta la función ac de dll que tiene un nombre único. Este nombre tiene que ser lo suficientemente único ya que las funciones no se pueden distinguir usando sus argumentos al cargar desde dlls.

La función C registra una o varias clases de fábrica llamadas "Driver". Cada clase de controlador está asociada a una cadena. Cuando la aplicación principal desea crear una clase, reúne la clase de fábrica relacionada utilizando la cadena asociada. También implementé un sistema de verificación de versiones para no cargar plugins antiguos.

La carga Dll se logra utilizando las funciones LoadLibraryA y GetProcAddress (Pugg actualmente funciona en Windows).

Una cosa que vale la pena mencionar es que la aplicación principal y las DLL deben compilarse utilizando el mismo compilador y utilizando las mismas opciones de compilación (modos de liberación / depuración, configuración de optimización, versiones stl, etc.). De lo contrario, podría haber problemas con la asignación de clases.


He tenido cierto éxito usando un sistema bastante ingenuo:

  • Crear una especificación de API para complementos
  • Use un administrador de plug-in singleton
  • Use LoadLibrary / GetProcAddress basado en el enlace dinámico de tiempo de ejecución
  • Implementar la inversión de la gestión de eventos basada en el control para notificar los complementos

La mejor plataforma y el mejor consejo de idioma que puedo dar es esto:

Diseña toda tu aplicación alrededor del plugin SDK.

IMO, un SDK de complemento no debe ser una idea de último momento. Si diseñas tu aplicación básicamente para que sea un shell vacío que carga complementos, entonces las características principales se implementan en tu propio SDK, obtienes los siguientes beneficios:

  • Alta modularidad de componentes y clara separación de propósitos (de alguna manera obliga a su arquitectura a ser buena)
  • Fuerza a tu SDK a ser realmente bueno
  • Permite a otros desarrolladores de terceros crear funciones de nivel core extremadamente potentes también
  • Los nuevos desarrolladores / empleados pueden comenzar fácilmente a trabajar en una nueva característica importante sin tener que tocar la aplicación principal; pueden hacer todo su trabajo en un complemento (lo que les impide atornillar cualquier otra cosa)

En C / C ++, probablemente utilice bibliotecas de enlaces dinámicos y punteros de función (C) o interfaces (clases que consisten únicamente en métodos virtuales puros, para C ++). Sin embargo, incluso si usa Javascript, aún recomendaría la arquitectura anterior.


Lo mejor es usar un marco como ACE ( http://www.cs.wustl.edu/~schmidt/ACE.html ) que lo proteja (lo mejor posible) de la codificación específica de la plataforma.

ACE contiene un marco de plugins que se basa en bibliotecas compartidas que puede usar para crear aplicaciones ensambladas dinámicamente.

Para obtener una abstracción de nivel superior, consulte CIAO ( http://www.cs.wustl.edu/~schmidt/CIAO.html ) la implementación C ++ de Código Abierto del Modelo de Componente CORBA.



Puede que esto no sea lo que estás buscando, pero podrías incluir un lenguaje de scripting en tu aplicación, como Lua. Lua se diseñó para integrarse en otros programas y utilizarse como lenguaje de scripts para escribir complementos. Creo que es bastante fácil agregar el intérprete de Lua a su programa, aunque no conozco a Lua, por lo que no puedo garantizar la efectividad de una solución. Otros con más experiencia con Lua, por favor agregue comentarios sobre su experiencia con la incrustación de Lua en otra aplicación.

Esto, por supuesto, significa que sus complementos deben escribirse en Lua. Si no le gusta Lua, entonces los intérpretes estándar de facto Perl, Python y Ruby están escritos en C, y pueden integrarse en un programa en C. Conozco una serie de programas que usan estos lenguajes como extensiones de lenguaje de scripting.

Sin embargo, no sé lo que estás buscando, ya que tu pregunta es un poco vaga. Tal vez sea apropiado más información sobre lo que quiere que las personas puedan hacer con dichos complementos. Para algunas tareas, un lenguaje de scripting completo puede ser un poco exagerado.