La producción de una Dll generalmente se divide en los siguientes pasos:
1 Escribir un procedimiento o función en un proyecto DLL
2 Escriba una palabra clave Exportaciones y escriba el nombre del procedimiento debajo de ella. No es necesario escribir parámetros ni llamar a sufijos.
Se pasaron dos parámetros
1 El tipo de parámetro debe ser coherente con el tipo de parámetro de la ventana C++. No utilice el tipo de datos DELPHI.
2 Lo mejor es tener un valor de retorno [incluso si es un procedimiento] para informar el éxito o el fracaso de la llamada, o el estado. El valor de retorno de éxito o fracaso es preferiblemente 1 [éxito] o 0 [fracaso]. En una palabra, es compatible con Windows C++.
3 Declare el sufijo con stdcall.
4 Preferiblemente distingue entre mayúsculas y minúsculas.
5 No es necesario utilizar el sufijo de llamada lejana, es solo por compatibilidad con programas de Windows de 16 bits.
Inicialización y limpieza de salida de tres archivos DLL [si se requieren inicialización y limpieza de salida]
1 DLLPRoc [un puntero de la unidad SysUtils] es la entrada a la DLL. Aquí puede reemplazar su entrada con su función. Pero su función debe cumplir los siguientes requisitos [en realidad, una función de devolución de llamada]. como sigue:
procedimiento DllEnterPoint(dwReason: DWord);far;stdcall;
Hay cuatro tipos de parámetros de dwReason:
DLL_PROCESS_ATTACH: Cuando el proceso entra
DLL_PROCESS_DETACH cuando el proceso sale
DLL_THREAD_ATTACH cuando entra el hilo
DLL_THREAD_DETACH cuando el hilo sale
En la sección de inicialización escriba:
DLLProc := @DLLEnterPoint;
DllEnterPoint(DLL_PROCESS_ATTACH);
2 Si hay un componente TdcomConnection en el formulario, use Uses Activex y escriba CoInitialize (nil) durante la inicialización;
3 Asegúrese de que DcomConnection.Connected := False al salir y que el conjunto de datos se haya cerrado. De lo contrario, la dirección informada 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 la 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 de imagen de memoria.
5. Llame a carga estática
1 Declaración de función del cliente:
1) Distingue entre mayúsculas y minúsculas.
2) Igual que la declaración en la DLL.
Tales como: showform(form:Tform);Far;external'yproject_dll.dll';
3) El tipo de parámetro pasado al llamar debe ser el mismo que el de Windows C++.
4) Al llamar, la DLL debe estar en la ruta de búsqueda de Windows. El orden es: ruta del directorio actual windows/system32;
Seis llamadas a la carga dinámica
1 Cree un tipo de procedimiento [Si tiene claro que la naturaleza de una variable de tipo de procedimiento es solo un puntero, sabrá lo que está pasando]. como:
tipo
mipuntero=procedimiento(formulario:Tform);Lejos;externo;
var
Consejo: Mango;
formulario de presentación: mi puntero;
comenzar
Hinst:=loadlibrary('yproject_dll');//Cargue un Dll y búsquelo por 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);// Llamado al encontrar el puntero de entrada de la función.
Biblioteca gratuita (pista);
fin;
7. Cree un TForM en la DLL
1 Usa su formulario en Dll, y las unidades asociadas utilizadas por su formulario también deben usarse en [Este es el punto más problemático, porque su formulario puede usar muchas unidades o funciones especiales]
2 Pase un parámetro de aplicación y utilícelo para crear el formulario.
8. Cree un TMDIChildForM en la DLL
1 MDIForm.FormStyle en Dll no necesita ser fmMDIChild.
2 Escriba las dos oraciones siguientes después de CreateForm:
función ShowForm(mainForm:TForm):entero;stdcall
var
Formulario1: TForm1;
ptr:PLongInt;
comenzar
ptr:=@(Application.MainForm);// Primero guarde el identificador MainForm de la dll, no es necesario liberarlo, simplemente reemplácelo
ptr^:=LongInt(mainForm);//Reemplace el formulario principal de la DLL con el formulario principal del programa que realiza la llamada. MainForm es una VENTANA especial que administra específicamente los recursos de Formularios en la Aplicación.
// ¿Por qué no directamente Application.MainForm: = mainForm, porque Application.MainForm es una propiedad de solo lectura?
Form1:=TForm1.Create(mainForm);//Crear con parámetros
fin;
Nota: El parámetro es Application.MainForm del programa que llama.
Nueve ejemplos:
Código fuente DLL:
Proyecto biblioteca2;
usos
SysUtils,
clases,
Diálogos,
formularios,
Unidad2 en 'Unidad2.pas' {Form2};
{$R*.RES}
var
ccc: Pchar;
procedimiento OpenForm(mainForm:TForm);stdcall;
var
Formulario1: TForm1;
ptr:PLongInt;
comenzar
ptr:=@(Aplicación.MainForm);
ptr^:=LongInt(principalForm);
Formulario1:=TForm1.Create(principalForm);
fin;
procedimiento EntradaCCC(Texto: Pchar);stdcall;
comenzar
ccc := Texto;
fin;
procedimiento ShowCCC;stdcall;
comenzar
MostrarMensaje(String(ccc));
fin;
exportaciones
formulario abierto;
EntradaCCC,
MostrarCCC;
comenzar
fin.
Código fuente de la persona que llama:
unidad Unidad1;
interfaz
usos
Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Cuadros de diálogo,
Controles estándar;
tipo
TForm1 = clase(TForm)
Botón1: TBotón;
Botón2: TBotón;
Edición1: TEditar;
procedimiento Button1Click(Remitente: TObject);
procedimiento Button2Click(Remitente: TObject);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
var
Formulario1: TForm1;
implementación
{$R *.DFM}
procedimiento OpenForm(mainForm:TForm);stdcall;Externo'project2.dll';
procedimiento ShowCCC;stdcall;Externo'project2.dll';
procedimiento InputCCC(Texto: Pchar);stdcall;Externo'project2.dll';
procedimiento TForm1.Button1Click (Remitente: TObject);
var
Texto: Pchar;
comenzar
Texto := Pchar(Edit1.Texto);
// OpenForm(Application.MainForm);//Para ajustar MDICHILD
InputCCC(Text);// Para experimentar si las variables globales en la DLL se comparten entre varias aplicaciones
fin;
procedimiento TForm1.Button2Click (Remitente: TObject);
comenzar
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. La aplicación de 16 bits puede ser diferente y no se han realizado experimentos.
fin;