Tutorial básico de DELPHI: programación de biblioteca de vínculos dinámicos (1)[3]
Llamadas estáticas o carga explícita
Utilice una cláusula de declaración externa para hacer que las DLL se carguen antes de que la aplicación comience a ejecutarse. Por ejemplo:
función Instr(SourceStr). : PChar; Verificar: Char) Integer; far; external UseStr;
Usando este método, el programa no puede determinar la llamada de DLL en tiempo de ejecución. poder ejecutar
Llamada dinámica o carga implícita
Usando las funciones API de Windows LoadLibray y GetProcAddress se pueden cargar dinámicamente archivos DLL y llamar a los procesos en ellos durante. tiempo de ejecución
p>
Si el programa solo llama al proceso de DLL en parte, o qué DLL usa el programa y qué proceso llama deben juzgarse en función del estado real del programa. ejecutándose, entonces usar llamadas dinámicas es una buena opción
Usando llamadas dinámicas, el programa puede continuar ejecutándose incluso si falla la carga de una DLL
Llamadas estáticas
Cuándo Al llamar estáticamente a un procedimiento o función en una DLL, la directiva externa se agrega al procedimiento o función. El procedimiento o función llamado en la declaración de declaración debe adoptar el modo de llamada remota. Esto puede usar la directiva de procedimiento lejano o un {$F}. pragma
Delphi admite los tres tipos de llamadas en la programación tradicional de la biblioteca de enlaces dinámicos de Windows. Los métodos son
● A través del nombre del procedimiento/función
● A través del. alias del procedimiento/función
● A través del número de secuencia del procedimiento/función
Llamar a través de alias de procedimientos o funciones proporciona flexibilidad en la programación del usuario y llamar a través de números de secuencia (Índice ) puede mejorar la velocidad de carga de la DLL correspondiente
Llamadas dinámicas
Funciones API de llamadas dinámicas
Hay tres funciones principales de la API de Windows utilizadas en llamadas dinámicas, a saber Loadlibrary, GetProcAddress y Freelibrary
Loadlibrary: carga el módulo de biblioteca especificado en la memoria
Sintaxis
Función Loadlibrary (LibFileName: PChar) THandle
LibFileName especifica el nombre de archivo de las DLL que se cargarán. Si LibFileName no contiene una ruta, Windows busca en el siguiente orden
( ) Directorio actual
( ) Directorio de Windows. (directorio que contiene win) La función GetWindowDirectory devuelve la ruta de este directorio
( ) Directorio del sistema de Windows (incluidos archivos del sistema como el directorio gdi exe) La función GetSystemDirectory devuelve la ruta de este directorio
() El directorio que contiene el archivo ejecutable de la tarea actual puede usar la función GetModuleFileName para devolver la ruta de este directorio
() Directorio de columnas en la variable de entorno PATH
() Red lista de directorios de imágenes
Si la función se ejecuta correctamente, se devuelve el identificador de instancia del módulo de biblioteca cargado. De lo contrario, se devuelve un código de error menor que HINSTANCE_ERROR. El significado del código es el siguiente:
Table Loadlibrary devuelve el significado del código de error
━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━ ━━━━━━━━━
Significado del código de error
La memoria del sistema es insuficiente y el archivo ejecutable está dañado o el la llamada es ilegal
Archivo no encontrado
Ruta no encontrada
Se intentó vincular dinámicamente una tarea o hubo un error de protección compartida o de red p>
La biblioteca debe configurarse para cada uno. Cree segmentos de datos separados para cada tarea
No hay suficiente memoria para iniciar la aplicación
La versión de Windows es incorrecta
p>El archivo ejecutable es ilegal o no es una aplicación de Windows o está en Hay un error en la imagen EXE
La aplicación está diseñada para un sistema operativo diferente (como SO/programa)
La aplicación está diseñada para MS DOS
Archivo ejecutable El tipo se desconoce
Intentando cargar una aplicación en modo real (diseñada para versiones anteriores de Windows )
Intentar cargar el segundo de un archivo ejecutable que contiene múltiples segmentos de datos grabables. Ejemplo
Intentar cargar un archivo ejecutable comprimido. El archivo debe descomprimirse antes de poder instalarse. /p>
Archivo de biblioteca de enlaces dinámicos ilegal
La aplicación requiere extensión de bits
━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━
Si otra aplicación ha cargado el módulo en la memoria antes de que la aplicación llame a Loadlibrary, Loadlibrary no cargará otra instancia del módulo pero aumentará el recuento de referencias de el módulo.
GetProcAddress: recoge la dirección de la función en el módulo dado
La sintaxis es
función GetProcAddress (Módulo: THandle; ProcName: PChar ) TFarProc;
El módulo contiene el identificador del módulo de biblioteca de funciones. Este valor lo devuelve Loadlibrary. Si el módulo se establece en nulo, significa que se hará referencia al módulo actual.
ProcName es un puntero a una cadena terminada en nulo que contiene el nombre de la función o también puede ser una función. Si el parámetro ProcName es un valor de secuencia, GetProcAddress aún devolverá un valor no nulo si la función de la secuencia. El valor no existe en el módulo. Esto causará confusión, por lo que en la mayoría de los casos usar el nombre de la función es una mejor opción. Si se usa un nombre de función, la ortografía del nombre de la función debe ser consistente con la ortografía correspondiente en la sección EXPORTACIONES. del archivo de biblioteca de enlace dinámico
Si GetProcAddress se ejecuta correctamente, devuelve la dirección de la entrada de función en el módulo; de lo contrario, devuelve nil
Freelibrary: elimina el módulo de biblioteca de la memoria
La sintaxis es
procedimiento Freelibrary (Módulo: THandle)
Módulo es el identificador del módulo de la biblioteca. Este valor viene dado por los retornos de Loadlibrary
Dado que el módulo de la biblioteca solo se carga una vez en la memoria, llamar a Freelibrary primero disminuye el recuento de referencias del módulo de la biblioteca en uno. Si el recuento de referencias se reduce a 0, el módulo se descarga
Cada uno. Cada vez que se llama Loadlibrary, debe llamar a FreeLibray una vez para asegurarse de que no haya módulos de biblioteca redundantes al final de la aplicación.
Aún permanece en la memoria después
Ejemplo de llamada dinámica
Para la llamada dinámica damos un ejemplo simple como el siguiente. El sistema 1*** contiene dos cuadros de edición. El primer cuadro de edición ingresa un. cadena en el segundo cuadro de edición y luego ingrese el carácter en el segundo cuadro de edición. Si el carácter está incluido en la cadena en el primer cuadro de edición, la visualización del cuadro de etiqueta se ubica en la enésima posición. carácter. Como se muestra en la interfaz de ejecución del programa
La implementación de la función de verificación de entrada es la siguiente en el proceso de procesamiento del evento OnKeyPress de Edit
Procedimiento TForm Editar KeyPress (Remitente: TObject; var Clave: Char)
var
orden: Entero
txt: PChar
PFunc: TFarProc
Moudle: THandle;
p>comenzar
Moudle:= Loadlibrary(c:\dlls\example dll)
si Moudle gt; /p>
begin
Editar texto:=;
Pfunc:= GetProcAddress(Moudle Instr)
txt:= StrAlloc()
txt:= StrPCopy(txt Editar texto)
Orden:= TInstr (PFunc) (clave de texto)
si Orden = entonces
Etiqueta Caption:= no contiene este carácter
else
Etiqueta Caption: = ubicada en la posición IntToStr (Orden)
end; p> Freelibrary (Moudle)
end;
Cuando se utiliza el puntero de función devuelto por GetProcAddess, se debe realizar una conversión de tipo forzada lishixinzhi/Article/program/Delphi/201311/25209 p>