Red de conocimiento informático - Conocimiento informático - Cómo escribir complementos basados ​​en QPlugins

Cómo escribir complementos basados ​​en QPlugins

El motor de complementos QPlugins se encuentra actualmente en desarrollo y ahora se pueden escribir complementos basados ​​en QPlugins.

Cada complemento de QPlugins proporciona uno o más servicios, que se registran en una instancia global de PluginsManager a la que todos los complementos pueden acceder directamente.

PluginsManager divide los servicios en tres categorías:

1. Loader (rama del cargador)

Los cargadores se utilizan para cargar servicios en complementos y su implementación es De la siguiente manera:

cargador de DLL: llamado TQDynamicLibraryLoader, solo aplicable a la plataforma Windows;

cargador de BPL:

cargador de BPL: llamado TQPackageLoader, carga el complemento BPL de Delphi. -in, una plataforma específica soportada por el propio Delphi/C++ Builder;

Cargador SO: llamado TQShareObjectLoader, que se utiliza para cargar el sistema operativo Linux/FreeBSD *** Share Object (servicios generalmente con un .so extensión). so extensión), pero actualmente Delphi no puede compilar el complemento correspondiente. Debe usar GCC u otras herramientas para generar el SO correspondiente y colocarlo en el directorio correspondiente para cargarlo;

Lo que está implementado actualmente en. el cargador Hay:

Cargador de scripts: TQPascalScriptLoader, basado temporalmente en el intérprete JvIntercept de JCL, esto es solo una demostración, de hecho, puede reemplazarlo con cualquier intérprete que desee usar Android/iOS/OSX; Independientemente de si la plataforma puede admitirlo, no he estudiado su código fuente y no hago ninguna promesa;

ProcessLoader: llamado TQProcessLoader, utilizado para cargar complementos a nivel de proceso. Admitirá plataformas Windows / Android / iOS / OSX, pero la primera implementación definitivamente será la plataforma Windows;

Cargador de red: llamado TQTCPLoader, utiliza el protocolo TCP para cargar complementos en computadoras remotas y admitirá la plataforma Windows / Android / iOS / OSX

2. Enrutadores: denominado TQTCPLoader, utiliza el protocolo TCP para cargar complementos en la computadora remota y admitirá plataformas Windows / Android / iOS / OSX; . p>2. Enrutador (rama del enrutador)

Actualmente, el enrutador no se ha implementado, por lo que actualmente, cuando accede al servicio correspondiente a través de ByPath o ById, en realidad obtiene el servicio si no existe. , regresa vacío. Si no existe, devuelve nulo. En el futuro, implementaremos un complemento de enrutador;

3. Otros servicios (ramas de servicio)

Las ramas de servicio las proporciona cada complemento y están organizadas por complemento. en sí mismo; las ramas de servicio se pueden ramificar en una estructura de árbol;

Bien, ahora tenemos una idea clara de lo que QPlugins incluye aproximadamente. Ahora, hablemos de la estructura del programa basada en el motor de complemento QPlugins.

El programa de complemento consta de un programa host y un complemento de extensión. El programa host es un programa ejecutable que puede ejecutarse en varias plataformas compatibles con el compilador Delphi. Antes de usar el complemento, debemos realizar las siguientes operaciones en el programa host:

1. Consulte la unidad QPlugins y la unidad de implementación del cargador que se utilizará

2. Si necesita utilizar un Si se llama al servicio proporcionado por el complemento, cuando se inicia el programa, llame al método PluginsManager.Loaders.Add para agregar el cargador correspondiente. Tenga en cuenta que estos cargadores también deben implementar IQService. e interfaces IQLoader;

3.

Llame a PluginsManager.Start para cargar el complemento y completar el registro del servicio;

4. Utilice la función PluginsManager.ByPath o ByPath o PluginsManager.ById para obtener la instancia de servicio correspondiente y luego podrá utilizar los servicios. proporcionado por varias funciones para completar la implementación comercial real.

Cuando el programa se cierre, llamará automáticamente al método PluginsManager.Stop para detener todos los servicios. No utilice ninguna instancia de servicio después de esto para evitar errores al acceder a direcciones no válidas. Si tiene instancias en caché de un servicio, regístrese en respuesta a la notificación NID_LOADERS_STOPPING, donde se liberarán las instancias correspondientes.

El complemento que proporciona servicios puede ser un programa ejecutable o texto plano (como un script). Se encarga de registrar los servicios que proporciona en el PluginsManager cuando el cargador carga el archivo correspondiente, y luego proporcionándolo a Otros programas. La implementación del servicio es transparente para el administrador del servicio PluginsManager. Como ejemplo de un complemento DLL, QPlugins le proporciona la unidad QPlugins.VCL, que debe incluirse si está escribiendo un complemento DLL basado en VCL para garantizar que los mensajes de la ventana se manejen correctamente.

Los pasos para escribir un programa de complemento incluyen:

1. Escribir la implementación de la interfaz del servicio

2. el acuerdo del cargador (si lo hay):

(1) El cargador de DLL, BPL o SO no proporciona ninguna interfaz adicional. Los usuarios pueden utilizar directamente los métodos integrados de inicialización y limpieza del lenguaje de desarrollo para implementarlo;

(2) Otros complementos pueden acordar las interfaces correspondientes; participe en las instrucciones de implementación del cargador correspondientes.

Al cargar un complemento, el cargador llamará a la interfaz correspondiente para completar el registro del servicio; al desinstalar el complemento, el desinstalador llamará a la interfaz correspondiente para completar el lanzamiento del servicio. Por supuesto, esta interfaz puede utilizar directamente la propia interfaz del sistema, o puede ser una interfaz acordada por el cargador. Solo el cargador y el complemento se preocuparán por esta interfaz, y la aplicación host no necesita preocuparse por estos detalles. .

También necesitamos conocer los siguientes puntos:

1. El nombre y el ID del servicio pueden repetirse en QPlugins. Antes de implementar el enrutador, siempre toma el. primer servicio encontrado; después de implementar el enrutador, el enrutador especifica cómo manejarlo;

2. También puede llamar a los servicios proporcionados por el programa anfitrión. Todo lo que tienes que hacer es consultar la instancia correspondiente a través del PluginsManager.

3. Al registrar un servicio, utilice la rama de servicio para registrarse directamente en lugar de utilizar el método ByPath / ById de PluginsManager para obtener el nodo principal del servicio. PluginsManager.ByPath/ById se proporcionan a la persona que llama, y ​​el enrutador puede filtrarlos para asignarlos a otra ruta real.

4. Se recomienda que lo coloque en su propio espacio de nombres al registrar el servicio para evitar conflictos de nombres con complementos implementados por otros (solo sugerencias, no obligatorios) y para facilitar la integración con otros complementos. -ins.

5. La cuestión de la instancia única y las instancias múltiples está determinada por el servicio en sí. Si desea admitir múltiples instancias, simplemente sobrecargue el método GetInstance para devolver una nueva instancia. La implementación predeterminada devuelve sí misma, una única instancia.

6. Un servicio puede o no ser seguro para subprocesos, así que asegúrese de comprender si es seguro para subprocesos antes de usarlo.