2010-09-27 19 views
5

Estoy trabajando en un proyecto en el que encontraría útil un sistema de complemento básico. Básicamente, creo la clase base y puedo proporcionar esta clase base a un desarrollador de complementos. Entonces el desarrollador lo anula y anula los métodos. Entonces aquí es donde se vuelve un poco confuso para mí. ¿Cómo funciona desde aquí? ¿Dónde podría encontrar documentación relacionada con el desarrollo de este tipo de sistema?¿Cómo funcionan los sistemas de complementos?

Gracias

Respuesta

7

los sistemas de plugin que conozco del todo el uso de las bibliotecas dinámicas. Básicamente, debe definir un pequeño y efectivo saludo de manos entre el kernel del sistema y los complementos. Como no hay C++ ABI, los complementos solo deben usar una API C o usar el mismo compilador (y probablemente la versión del compilador) como kernel del sistema.

El protocolo pensable más simple sería una función que todos los desarrolladores de complementos tendrían que proporcionar, que devuelve una instancia de una clase derivada de su clase base, devuelta como un puntero de clase base. (El extern "C" se asegura de que la función no tendrá un nombre revuelto, y por lo tanto es más fácil de encontrar por su nombre.) Algo así como:

extern "C" { 
    plugin_base* get_plugin(); 
} 

El núcleo entonces intentará cargar archivos binarios que se encuentran en los lugares designados como dinámico bibliotecas e intento de encontrar la función get_plugin(). Si tiene éxito, llama a esta función y termina con una instancia de complemento cargada.

Por supuesto, sería bueno tener también funciones para verificar la versión de la API compilada contra la versión del kernel. (Después de todo, puede cambiar esa clase base). Y puede que tenga otras funciones, que devuelven información sobre el complemento (o lo tiene como virtuales en la clase base). Eso depende mucho de la naturaleza de su sistema.

+0

Si plugin_base no es POD pero es una clase que hereda de la clase de plugin base, creo que para que todo funcione algún tipo de C++ ABI (el definido por el compilador que utilizó) tendría que ser utilizado.: S –

+0

@Matteo: Sí, tienes un punto muy válido allí. Gracias. Adapte mi respuesta en consecuencia. – sbi

+1

No hay problema. :) Por cierto, una alternativa en Windows sería usar COM, que en realidad se puede ver parcialmente como un C++ ABI compatible con otros lenguajes. –

1

Puede compilar el complemento como biblioteca dinámica/compartida ponerlo en la carpeta del complemento y luego desde su código cargar dinámicamente todos los archivos dll desde la carpeta del complemento.
Puede verificar el código fuente de programas como GIMP para verificar cómo implementan el plugin.

1

Probablemente la documentación casi la única que podrá encontrar será de los sistemas existentes.

Básicamente, tiene dos tipos comunes de complementos. Uno maneja cosas como traducciones a/desde algún tipo de archivo foráneo. En este caso, normalmente tiene tres funciones: una para reconocer el formato de archivo, una para leer y otra para escribir. Junto con esos, normalmente tendrá algunas cadenas para especificar una extensión de archivo.

Otra posibilidad es algo que procesa dentro de su programa. En este caso, típicamente especificará algunas entradas que se agregarán a su estructura de menú y una función que se invocará para cada una. En la mayoría de los casos, tendrá al menos otra función para hacer algo con la serialización de su configuración actual. A partir de ahí, dependerá de usted decidir cómo exponer lo suficiente de las funciones internas de su programa para que pueda hacer algo útil.

2

En Linux, un complemento es una biblioteca compartida (con una extensión .so) que proporciona una o más funciones nombradas en su API de complemento. Su programa abre la biblioteca con dlopen y obtiene punteros a las funciones usando dlsym y llama a las funciones usando los punteros. El complemento puede llamar a cualquier función que se exporte públicamente de su programa.