La primera pregunta que haría sería, ¿necesita los complementos para acceder a la interfaz de usuario de su aplicación de host, o agregar algún elemento de la interfaz de usuario propio? ¿O los complementos se limitarán a consultar y/o suministrar datos a su aplicación host?
Esto último es mucho más fácil y abre dos posibilidades. Otros ya han mencionado las DLL, que es la primera forma de hacerlo. Se aplican ciertas advertencias: en general, debe interactuar con un dll usando solo los tipos de datos que se usan en la API de Windows. De esta manera, puede estar seguro de que los archivos DLL de complemento comprenderán sus tipos de datos, sin importar en qué idioma/compilador se crearon (así, por ejemplo, use PChars, no cadenas. No pase, por regla general, clases Delphi como TStream a una DLL. Esto parecerá funcionar en algunos casos, pero no es seguro en general, porque incluso si la DLL se compiló en Delphi, puede haber sido una versión diferente del compilador, con una idea ligeramente diferente de lo que es TStream). Google para usar archivos DLL en Delphi, y encontrará muchos más consejos.
Otra forma que aún no se ha mencionado es habilitar los scripts en su aplicación. Hay varios motores de scripting de terceros muy capaces, tanto comerciales como gratuitos, y la mayoría de ellos le permiten intercambiar objetos Delphi con el script. Algunas de estas bibliotecas solo admiten Pascal como lenguaje de scripting, otras te permitirán usar Basic (quizás mejor para usuarios principiantes) u otros idiomas. Ver, por ejemplo, RemObjects Pascal Script (gratis) en http://www.remobjects.com/free.aspx.
Mi solución de scripting favorita en este momento es Python para Delphi (P4D, también gratis) de http://mmm-experts.com/Products.aspx?ProductID=3 Puede interactuar maravillosamente con sus clases a través de RTTI, y le permite ejecutar código Python en su aplicación Delphi, así como usar Delphi clases en scripts de Python. Dada la popularidad de Python, esta puede ser una solución viable si desea atraer desarrolladores a su proyecto. Sin embargo, cada usuario deberá tener una distribución de Python instalada.
Me parece que la barrera de entrada, desde el punto de vista de posibles escritores de plugins, es menor si usa scripts que si elige DLL.
Ahora, volviendo a mi pregunta inicial: las cosas se vuelven mucho más complicadas si necesita los complementos para interactuar con su interfaz de usuario, p. colocando controles en él. En general, las DLL no se pueden usar para hacer esto. La forma de Borland/CodeGear es utilizar paquetes (BPL). Con los BPL, puede acceder e instanciar las clases que ofrece un complemento como si estuvieran declaradas en su aplicación de host. El truco es que todos los BPL se deben compilar con la misma versión exacta y compilación de Delphi que su aplicación principal. En mi opinión, esto hace que los paquetes sean completamente poco prácticos, ya que es difícil esperar que todos los escritores de plugins potenciales de todo el mundo utilicen la misma versión de Delphi que eres. Una gran trampa.
Para evitar esto, he experimentado con un enfoque diferente: seguir usando DLL, y desarrollar una sintaxis para el plugin para describir la UI que necesita, luego crear la UI usted mismo en la aplicación de host. (XML es una forma conveniente de expresar la UI, ya que obtiene el concepto de parenting/nesting gratis). La sintaxis de la descripción de UI puede incluir devoluciones de llamada a la DLL activada cuando cambia el contenido o el estado del control. Sin embargo, este método restringirá los complementos al conjunto de controles de VCL que su aplicación ya usa o ha registrado. Y no es un trabajo de una noche, mientras que los BPL sí lo son.
Google para "Delphi plugin framework", también. Existen algunas soluciones listas para usar, pero hasta donde yo sé, generalmente usan BPL, con su utilidad limitada.
Ver explicación adicional en mi respuesta – Serguzest