¿Cómo utilizar DLL en Delphi?
Pasos generales para crear una biblioteca de vínculos dinámicos
Doble transferencia de parámetros
Inicialización y limpieza de salida de tres dll [Si inicialización y salir son necesarios Limpieza de salida]
El uso de cuatro variables globales
Cinco llamadas a carga estática
Seis llamadas a carga dinámica
7. Cree un TForM en la DLL.
8. Cree un TMDIChildForM en la DLL.
Nueve ejemplos:
Diez problemas comunes en la programación mixta Dll entre Delphi y otros lenguajes:
XI. Información relacionada
La generación de DLL generalmente se divide en los siguientes pasos:
1 Escribir un procedimiento o función en el proyecto DLL.
2 Escribe una palabra clave de Exportaciones y escribe el nombre del proceso debajo de ella. No es necesario escribir parámetros ni llamar a sufijos.
Transferencia de parámetro doble
El tipo de parámetro 1 debe ser el mismo que el de la ventana C. No utilice el tipo de datos DELPHI.
Sería mejor tener un valor de retorno (o incluso un procedimiento) para informar el éxito o el fracaso de la llamada, o el estado. El valor de retorno para el éxito o el fracaso es preferiblemente 1 [éxito] o 0 [fracaso]. En definitiva, es compatible con Windows C.
3 Utilice stdcall para declarar el sufijo.
4 Es mejor distinguir entre mayúsculas y minúsculas.
No es necesario utilizar el sufijo far, esto es sólo por compatibilidad con programas de Windows de 16 bits.
Inicialización y limpieza de salida de tres dlls [si se requieren inicialización y limpieza de salida]
1 proceso DLL [un puntero a la unidad sysutils] es la entrada a la DLL. Aquí puede reemplazar sus entradas con su función. Pero su función debe cumplir los siguientes requisitos [en realidad, una función de devolución de llamada]. Como se muestra a continuación:
Procedimiento DllEnterPoint(dw motivo: DWORD); stdcall
Hay cuatro tipos de parámetros de dwReason:
DLL_PROCESS_ATTACH: cuando el proceso entra.
Cuando sale el proceso DLL_PROCESS_DETACH.
Cuando entra el hilo DLL_THREAD_ATTACH
Cuando sale el hilo DLL_THREAD_DETACH.
En la sección de inicialización, escriba:
DLLProc:=@DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2. Si hay es un componente TdcomConnection en el formulario, use Activex y escriba un CoInitialize (nil) durante la inicialización;
Asegure la conexión DCOM. conectado: = falso, el conjunto de datos se cierra al salir. De lo contrario, la dirección es incorrecta.
El uso de cuatro variables globales
En el programa Widnows de 32 bits, los espacios de direcciones de las dos aplicaciones no están relacionados entre sí. Aunque la DLL es una copia en memoria, las variables están en el espacio de direcciones de cada proceso, por lo que no puede usar las variables globales de la DLL para transferir datos entre dos aplicaciones a menos que use un archivo espejo de memoria.
Cinco llamadas a carga estática
1 Reputación de la función cliente:
1) Distingue entre mayúsculas y minúsculas.
2) Igual que la declaración en la DLL.
Por ejemplo: showform(form:t form); far; external "y project_dll.dll";
3) El tipo de parámetro pasado en la llamada también es el mismo que el de Windows. do.
4) La DLL debe estar en la ruta de búsqueda de Windows al llamar, en el orden: ruta de acceso al directorio actual; ventana windows\system32
Seis llamadas dinámicas; cargando
1 Cree un tipo de proceso [Si sabe que la esencia de una variable de tipo de proceso es solo un puntero, sabrá lo que está pasando]. Por ejemplo:
Tipo
mi puntero = procedimiento(formulario: t formulario);
Definir variables
hinst; : Thandle;
showform: my pointer;
Inicio
hinst:= loadlibrary(' y project _ dll '); //Carga un Dll, presiona Búsqueda de nombre de archivo.
showform:=getprocaddress(Hinst, 'showform'); //Buscar por nombre de función, distingue entre mayúsculas y minúsculas. Esto queda claro si conoce la naturaleza de los objetos de automatización.
showform(application . mainform); //Se llama cuando se encuentra el puntero de entrada de la función.
Biblioteca gratuita (Hinst);
Fin;
7. Crear un TForM en la DLL.
1 Use su formulario en Dll, y las unidades asociadas utilizadas en su formulario también deben usarse [Este es el punto más problemático, porque su formulario puede usar muchas unidades o funciones especiales].
Pase un parámetro de la aplicación y utilícelo para crear un formulario.
8. Cree un TMDIChildForM en la DLL.
Formulario MDI. 1 FormStyle en Dll no necesita ser fmMDIChild.
2Escribe las dos oraciones siguientes después de CreateForm:
Función ShowForm (forma principal: forma t): integer; stdcall
Definir variables
formulario 1:t formulario 1;
ptr: PLongInt;
Inicio
ptr:=@(Application.MainForm); //Primero guarde el formulario principal; manejar el dll sin soltarlo, solo reemplazarlo.
ptr^:=longint(mainform); //Reemplace el formulario principal de la DLL con el formulario principal del programa de llamada principal. El formulario principal es una ventana especial que administra los recursos del formulario en la aplicación.
//Por qué no aplicarlo directamente. MainForm := mainForm según se aplica. MainForm es una propiedad de sólo lectura.
Formulario1:=TForm1. Crear (formulario principal); //Crear con parámetros
Fin;
Nota: El parámetro es la aplicación. Llame al formulario principal del programa.
Nueve ejemplos:
Código fuente DLL:
Proyecto de biblioteca 2;
Uso
SysUtils,
Clase,
Cuadro de diálogo,
Formulario,
Unidad2 en "unidad 2 . pas "{ formulario 2 }"
{$R*.
RES}
Definir variables
CCC: Pchar;
Formulario abierto de proceso (formulario principal: stdcall
Definir variables);
formulario 1: t formulario 1;
ptr: PLongInt;
Inicio
ptr: =@(Application.MainForm);
ptr^:=longint(formulario principal);
Form1:=TForm1. Crear (formulario principal);
Fin
Entrada del proceso cc(Texto: stdcall
Inicio
CCC: =); Texto;
Fin;
El programa muestra CCC;
Inicio
ShowMessage(String (CCC));
p>Fin;
Salir
OpenForm
Ingresar CC,
Mostrar CCC
Iniciar
Fin.
Código fuente de la persona que llama:
Unidad unidad 1;
Conexión
Uso
Ventana, mensaje, Sistema , clase, gráficos, control, formulario, cuadro de diálogo,
StdCtrls
Tipo
TForm1 = clase(TForm)
botón 1 : TButton;
botón 2: botón t
editar 1: TEdit;
Botón de programa 1Haga clic (remitente: al objeto
p); >Botón de proceso 2Haga clic (remitente: para objetar);
Privado
{Declaración privada}
Público
{Público declaración}
Fin;
Definir variables
forma 1: t forma 1;
Rendimiento
{ $R*. DFM}
Formulario abierto del proceso (formulario principal: formulario t); stdcall external "proyecto 2. dll";
El programa muestra stdcall external "proyecto 2. dll"; /p>
Entrada del proceso cc(Texto: Pchar); stdcall external "proyecto 2. dll";
Programa TForm1. Button1Click(Remitente: al objeto);
Definir variables
Texto: Pchar
Inicio
Texto: = Pchar(Edit1 . text );
// OpenForm (Application. MainForm); // Para ajustar MDICHILD
InputCCC (texto); Compartir entre aplicaciones.
Fin;
Programa TForm1. Button2Click(Sender: to object);
Inicio
ShowCCC//Esto muestra que las variables globales en la DLL de la aplicación WINDOWS de 32 bits también están en el espacio de direcciones de la aplicación, y el Aplicación de 16 bits Los procedimientos pueden ser diferentes, por lo que no se realizaron experimentos.
Fin;