Pregunta

El Plug-in de sistemas en C++ son difíciles debido a la ABI no está correctamente definido, y cada compilador (o versiones de los mismos) sigue sus propias reglas.Sin embargo, COM en Windows muestra que es posible crear un mínimo sistema de plug-ins que permite a los programadores de compiladores diferentes para crear plugins para una aplicación de host utilizando una sencilla interfaz.

Vamos a ser prácticos, y dejar el estándar de C++, que no es muy útil en este sentido, a un lado por un minuto.Si quiero escribir una aplicación para Windows y Mac (y, opcionalmente, Linux) que soporta C++ plugins, y si quiero dar el plug-in de autores razonablemente una gran variedad de compiladores (digamos de menos de 2 años de edad de las versiones de Visual C++, GCC o Intel C++ compiler), qué características de C++ podría contar?

Por supuesto, supongo que los plugins sería escrito para una plataforma específica.

La parte superior de mi cabeza, aquí están algunas características de C++ que se me ocurre, con lo que creo que es la respuesta:

  • vtable de diseño, el uso de los objetos a través de las clases abstractas?(sí)
  • tipos integrados, los punteros?(sí)
  • las estructuras de los sindicatos?(sí)
  • las excepciones?(no)
  • extern "C" funciones?(sí)
  • stdcall no extern "C" de las funciones integradas, los tipos de parámetro?(sí)
  • no stdcall no extern "C" funciones definidas por el usuario tipos de parámetro?(no)

Agradecería cualquier experiencia que usted tiene en esa zona que podría compartir.Si usted sabe de cualquier moderadamente exitosa aplicación que tiene un C++ sistema de plug-ins, que también es bueno.

Carl

¿Fue útil?

Solución

El dr. Dobb la Revista tiene un artículo La Construcción De Su Propio Plugin De Marco:Parte 1 que es bastante buena lectura sobre el tema.Es el inicio de una serie de artículos que abarca la arquitectura, el desarrollo y la implementación de un C/C++ de la cruz-plataforma plugin marco.

Otros consejos

También puede ser que desee considerar la sustitución de los convencionales plugin interfaz una interfaz de secuencias de comandos.Hay algunos muy buenos enlaces para varios lenguajes de secuencias de comandos en C/C++ que ya se han resuelto su problema.Esto podría no ser una mala idea para construir en la parte superior de ellos.Por ejemplo, eche un vistazo a Boost.Python.

Qt tiene un muy buen sistema de plugins que he usado en el pasado.Se utiliza Qt del meta-objeto del sistema para superar muchos de los problemas que normalmente se encuentra cuando se intenta desarrollar en C++ plugins.

Un ejemplo es cómo Q_DECLARE_INTERFACE las obras, para evitar el uso de un plugin incompatible.Otro es el construir clave, para asegurarse de que usted carga el plugin correcto para su arquitectura, sistema operativo, compilador.Si usted no usa Qt del sistema de plugins, estas son cosas que usted tendrá que preocuparse acerca de e inventar soluciones por su propia cuenta.Esto no necesariamente es ciencia de cohetes, y no estoy diciendo que iba a fallar, pero los chicos de Trolltech son bastante inteligentes y he pasado un rato pensando, y prefiero usar lo que ellos crean que reinventar la rueda a mí mismo.

Otro ejemplo es que RTTI normalmente no funciona en los límites DLL, pero cuando se utiliza Qt, cosas como qobject_cast que se basan en el meta-objeto de sistema de trabajo en los límites DLL.

Creo que usted está seguro de la creación de un sistema de plugins basados en:

  • Embalaje de la funcionalidad de complemento en la biblioteca (.dll, .así, etc.)
  • Necesidad de que el plugin de exponer clave C-idioma de las exportaciones.
  • Necesidad de que el plugin de implementar (y devuelve un puntero o referencia a) un resumen de C++ de la interfaz.

Probablemente el más exitoso de C++ sistema de plugins:buena viejo Adobe Photoshop.Y si no es eso, uno de los virtual sintetizador de formatos tales como VSTi etc.

El libro Imperfecto C++ por Matthew Wilson tiene una buena información acerca de este.

El asesoramiento en la que parece ser:siempre que utilice el mismo (o equivelant) compilador, puede utilizar C++, de lo contrario usted está mejor con C como una interfaz en la parte superior de su código de C++.

ACE tiene una cruz plataforma de arquitectura de plug-in.

Echa un vistazo:

  1. ACE DLL
  2. ACE Manager DLL

Sugiero que lo consultes el libro
El AS de Guía del Programador

Firefox se ejecuta en XPCOM (http://www.mozilla.org/projects/xpcom/).Es inspirada por Microsoft COM, pero es multiplataforma.

Tengo mi propio motor de juego, que tiene un C++ sistema de plug-ins.

Tengo algo de código en los archivos de encabezado de modo que se ponga en el plugin de la unidad de compilación.

Funciones más grandes que viven en el principal motor de llamada a través de un exportados función C (plugin llamadas MyObject_somefunction(MyObject *obj) que en el motor solo llamadas obj->somefunction()).En caso de llamar a una función en C es feo para su gusto, luego con algunos de encabezado de engaño, cuando el encabezado se incluye en el plugin, tiene la función de miembro de #define para llamar a la función de C:

#if defined(IN_THE_PLUGIN)
void MyObject::somefunction() { MyObject_somefunction(this); }
#endif

Las funciones virtuales tienen que ser puro o el código de vidas en el archivo de encabezado.Si no estoy heredando de una clase y solamente la creación de instancias de uno, virtual código de la función se puede vivir en el motor, pero, a continuación, la clase debe de exportación de algunas de las funciones C para crear y destruir el objeto que se llama el plugin.

Básicamente, los trucos que he utilizado, con el objetivo de mantener la total independencia de la plataforma, sólo la cantidad C de las exportaciones y el archivo de encabezado de trucos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top