2009-09-08 18 views
8

Tengo una aplicación Delphi para la que he escrito un .exe.¿Cómo puedo llamar a las funciones de Delphi en un bpl desde un ejecutable?

Básicamente, había una DLL que tenía un montón de funciones, una de las cuales llamaba iterativamente una vez que mi envoltorio hacía lo que necesitaba. No tengo el control de este archivo dll, y nunca lo estaré.

Bueno, ahora esta DLL es una BPL, y no estoy seguro de cómo llamar a las funciones dentro de ese archivo. Gracias por adelantado.

Respuesta

10

La manera más fácil de usar las funciones de un paquete es "usar" la unidad que contiene la función, llamarla como de costumbre y poner el paquete en la lista de paquetes de tiempo de ejecución de su proyecto. Para que funcione, existen algunos requisitos:

  1. Su proyecto debe utilizar la misma versión de Delphi que se utilizó para compilar el paquete.
  2. Debe tener acceso al archivo DCU para la unidad, o al menos al archivo DCP para el paquete.
  3. El paquete debe existir en la ruta de búsqueda del sistema operativo cuando se inicia el programa.

Si no puede satisfacer el tercer requisito, o si no desea tener el paquete cargado todo el tiempo, puede llamar al LoadPackage en su lugar. La forma de hacerlo funcionar es tener otro paquete que esté cargado todo el tiempo. Será utilizado tanto por su proyecto como por el paquete que desea cargar. El paquete intermedio expondrá una interfaz (como algunas funciones de registro, una variable o una clase) que el paquete principal puede usar para indicar a la aplicación cuáles son sus funciones. No podrá "usar" directamente la unidad del paquete principal en su aplicación.

Si no puede satisfacer los dos primeros requisitos, existe la forma mucho más difícil, que es también lo que tendría que hacer si su aplicación no está escrita en Delphi o C++ Builder. Trate el paquete como una DLL ordinaria. Cargarlo con LoadLibrary. Use GetProcAddress para cargar su función Initialize y luego llámelo. (Recuerde que la convención de llamadas es register, no stdcall). A continuación, cargue la dirección de la función que desea llamar, teniendo en cuenta que el nombre de la función se ha alterado para incluir cierta información de unidad y tipo. Llame a la función Finalize antes de llamar al FreeLibrary. Compruebe la fuente para LoadPackage y UnloadPackage; si necesita llamar al CheckForDuplicateUnits, probablemente dependa de si puede satisfacer el requisito número 1.

+0

¿De alguna manera me puede indicar un recurso para hacer esto? En realidad no soy un programador de Delphi, así que estoy perdido por algunas de estas cosas. – Dan

+0

No conozco ningún recurso que describa cómo cargar paquetes "manualmente" de la forma en que lo delineé en el párrafo final. La forma normal de usar paquetes, como se describe en el penúltimo párrafo, es algo que esperaría que aparezca en la ayuda de Delphi, aunque no puedo verificarlo porque no tengo instalado Delphi en ningún lado. –

2

Un BPL es solo una DLL con algunas adiciones específicas. No debería tener problemas para invocar funciones como lo hizo con el archivo DLL, con una advertencia específica: el BPL debe estar integrado en la misma versión de Delphi que está utilizando. Esto puede ser un gran inconveniente si no tienes el código fuente. Si esto es un problema para usted, probablemente deba hablar con quien lo haya creado y pedirle que lo haga volver a una DLL.

+0

-1, estoy totalmente en desacuerdo con la idea de 'Volver al DLL-Infierno'. Los BPL ofrecen una interfaz muy rica y una gestión de memoria transparente. –

+0

Si le gustan las implicaciones de esto, no cambia el hecho objetivo de que no puede cargar un BPL desde un ejecutable de Delphi compilado con una versión diferente de Delphi. Si conoce una forma de hacerlo, estaría * muy * interesado en saber cómo ... –

+0

BPL sin duda se pueden construir con una versión diferente de Delphi, si uno se pega a la interfaz DLL y los tipos compatibles con DLL (sin cadenas) para comenzar). – mghie

1

Un BPL puede eliminar una gran cantidad de problemas de DLL. Si puede vincularlo estáticamente, el borde se vuelve casi transparente. Si tiene que cargarlo dinámicamente, necesita una función de acceso estilo DLL (generalmente una que devuelve un objeto o una interfaz) y algunas definiciones de tipo común (interfaz). Todo lo que debe ser suministrado por el fabricante del BPL.

+0

¿Cuál sería el beneficio de crear un "dll que tuviera un montón de funciones, una de las cuales llamaría" en un BPL? Ninguno de los beneficios que cites parece importar para el OP. Tal vez él no sufrió ninguno de esos problemas de DLL tampoco? – mghie

+0

Depende de los parámetros de esa función. Mayb Dan puede publicar una línea de encabezado. –

Cuestiones relacionadas