Una biblioteca de enlaces dinámicos es una colección de procedimientos y funciones que pueden ser invocadas por aplicaciones y otras DLL. Contiene código o recursos públicos. Dado que el código DLL utiliza tecnología de uso compartido de memoria, Windows también le otorga a la DLL algunos permisos más altos en algunos lugares, por lo que la DLL puede implementar algunas funciones que los programas comunes no pueden lograr, como implementar Windows HOOK, ISAPI, etc. Al mismo tiempo, DLL también proporciona una forma conveniente de compartir código entre diferentes idiomas. Por lo tanto, DLL se usa ampliamente en programación. Este artículo presentará cómo crear y usar DLL en Delphi.
uno. Mecanismo para compartir memoria de la biblioteca DLL
Desde la perspectiva del uso, DLL y la unidad son muy similares. Ambos pueden ser llamados por otros módulos del proyecto, pero existen diferencias en sus mecanismos de implementación internos. Si un módulo de programa usa una declaración de usos para hacer referencia a una unidad, cuando el compilador compila el módulo, lo compilará junto con la unidad y vinculará el código ejecutable compilado al módulo de programa. Así es como un módulo de programa puede El motivo de la llamada. procedimientos y funciones en la unidad referenciada. Cuando varios proyectos hacen referencia a la misma unidad, cada proyecto contiene el código ejecutable de la unidad. Cuando se ejecutan varios proyectos que contienen la unidad al mismo tiempo, el código ejecutable de la unidad se actualizará varias veces con diferentes proyectos. en la memoria, provocando un desperdicio de recursos de memoria. DLL es diferente incluso si es llamado por un determinado proyecto, sigue siendo independiente después de la compilación, es decir, después de la compilación, una biblioteca DLL forma un archivo ejecutable separado y no está conectado con ningún otro archivo ejecutable. La biblioteca DLL no está subordinada a un proyecto específico. Cuando varios proyectos llaman a la misma biblioteca DLL, solo el primer proyecto transfiere la biblioteca DLL a la memoria. Los otros proyectos no transfieren repetidamente la misma biblioteca DLL a la memoria, sino que la leen. misma área de memoria compartida. Además, el código de ejecución de la DLL se transfiere dinámicamente durante la ejecución del programa, en lugar de transferirse a la memoria junto con todo el proyecto cuando el programa se está ejecutando. Esto puede eliminar las desventajas causadas por la unidad de que el mismo código ocupa memoria en varios lugares.
2. Creación de biblioteca DLL en Delphi
En el entorno Delphi, escribir una DLL no es muy diferente de escribir una aplicación general. De hecho, la escritura de funciones DLL como el cuerpo principal de DLL no requiere ningún otro medio especial excepto por las diferencias en la memoria y la gestión de recursos.
El formato de los archivos generales del proyecto es:
Título del proyecto del programa;
cláusula de usos;
Cuerpo del programa
El formato de los archivos de proyecto DLL es:
título del proyecto de la biblioteca;
cláusula de usos;
cláusula de exportación;
Cuerpo del programa
Hay dos diferencias principales entre ellos:
1. Generalmente, el encabezado de los archivos de proyecto usa la palabra clave programa, mientras que el encabezado de los archivos de proyecto DLL usa la palabra clave biblioteca. Diferentes palabras clave le indican al compilador que genere diferentes archivos ejecutables. La palabra clave del programa se usa para generar un archivo .exe y la palabra clave de la biblioteca se usa para generar un archivo .dll;
2. Si la DLL desea exportar funciones o procedimientos para su uso por otras aplicaciones, estas funciones o procedimientos deben enumerarse en la cláusula de exportaciones. Estas funciones o procedimientos deben compilarse utilizando la directiva de compilación de exportación.
Seleccione el elemento nuevo... en el archivo del menú principal de Delphi, haga doble clic en el icono DLL en la ventana emergente y se proporcionará automáticamente el marco del módulo fuente DLL, de la siguiente manera:
Proyecto biblioteca1;
{...anotación...}
usos
SysUtils, Clases;
comenzar
fin.
A continuación, puede agregar las definiciones de los procedimientos y funciones que desea implementar en la DLL entre USES y comenzar, y usar exportar y exportar para exportarlos para que otros módulos puedan hacer referencia a ellos. Agregar código de inicialización entre el inicio y el final. se utiliza para inicializar variables DLL. Cabe señalar que incluso si no hay un código de inicialización, no se pueden omitir el inicio y el final, como en el siguiente ejemplo:
bibliotecaminmax;
functionMin(X,Y:Entero):Entero;exportar;
comenzar
ifX<YthenMin:=XelseMin:=Y;
fin;
functionMax(X,Y:Entero):Entero;exportar;
comenzar
ifX>YthenMax:=XelseMax:=Y;
fin;
exportaciones
Minindex1,
Maxíndice2;
comenzar
fin.
Después de compilar y guardar como minmax.DLL, se forma un archivo de biblioteca DLL.
Acceso a tres bibliotecas DLL
Hay dos formas de acceder a la biblioteca DLL, una es referencia estática y la otra es referencia dinámica.
Cargar una DLL usando un método de referencia estático requiere dos cosas: crear una unidad de entrada para la biblioteca DLL y usar USES para conectar la unidad de entrada al módulo de programa que usa las funciones de la DLL. La única diferencia entre la unidad de entrada creada para la biblioteca DLL y la unidad ordinaria es que los procedimientos y funciones declarados en su interfaz no proporcionan el código de implementación real en su parte de implementación. En cambio, la palabra clave externa se usa para declarar los procedimientos y. funciones Los detalles de implementación se delegan a módulos DLL externos.
La sintaxis para utilizar el comando externo es la siguiente:
procedimiento/función nombre del procedimiento/función; nombre del módulo externalDLL;
El siguiente es el archivo fuente de la unidad de entrada testdll.pas escrito para la biblioteca minmax.DLL creada anteriormente. A partir de él, podemos ver algunas diferencias entre la unidad de entrada y la unidad general.
unidadtestdll;
interfaz
usos
functionMin(X,Y:Entero):Entero;
functionMax(X,Y:Entero):Entero;
implementación
functionMin;externo'minmax.DLL';
functionMax;externo'minmax.DLL';
fin.
Si una aplicación quiere llamar a una función en minmax.DLL, solo necesita agregar la unidad testdll a su declaración de usos.
Cargar dinámicamente una DLL requiere tres funciones API de Windows. Loadlibrary, Freelibrary y GetprocAddress. La función loadlibrary se utiliza para cargar la biblioteca DLL. Su formato de llamada es el siguiente:
funciónloadlobrary(DLLfileName:Pchar):THandle:
Cuando ya no se necesita una biblioteca DLL, se debe llamar a la función FreeLibrary para liberarla y liberar valiosos recursos de memoria. El formato de llamada es el siguiente:
procedimientoFreeLibrary(Libmodule:THandle)
Libmodule es el identificador de la biblioteca DLL obtenido mediante la llamada LoadLibrary. En el segmento del programa entre cargar una biblioteca DLL con la función loadlobrary y llamar a FreeLibrary para liberar la biblioteca DLL, puede usar los procedimientos y funciones en la biblioteca DLL. El método de uso específico es: use la función GetprocAddress para obtener la dirección de. la función en la biblioteca DLL. Pásela a una variable de función en el programa y luego use la variable para llamar a la función DLL. La función GetprocAddress se declara de la siguiente manera,
funciónGetprocAddress(Libmodule:THandle:procname:pchar):TFarProc:
Como se muestra en el siguiente ejemplo:
tipo
TTimeRec=registro
Segundo:Entero;
Minuto:Entero;
Hora:Entero;
fin;
TGetTime=procedimiento(varTime:TTimeRec);
THandle=Entero;
var
Hora: TTimeRec;
Mango:TMango;
Obtener Hora: TGet Hora;
...
comenzar
Identificador:=LoadLibrary('DATETIME.DLL');
si maneja <> 0 entonces
comenzar
@GetTime:=GetProcAddress(Handle,'GetTime');
if@GetTime<>nilentonces
comenzar
ObtenerTiempo(Tiempo);
conTimedo
WriteLn('La hora es',Hora,':',Minuto,':',Segundo);
fin;
Biblioteca gratuita (mango);
fin;
fin;
Al llamar a la biblioteca de vínculos dinámicos, debe tener en cuenta que la biblioteca de vínculos dinámicos requerida debe estar en el mismo directorio que la aplicación o en el directorio WindowsSystem.
Las bibliotecas de enlaces dinámicos son una forma importante de organizar programas en Windows. El uso de bibliotecas de enlaces dinámicos puede proteger en gran medida el trabajo realizado por los usuarios en diferentes herramientas de desarrollo y diferentes períodos y mejorar la eficiencia de la programación.