Red de conocimiento informático - Computadora portátil - Tutorial básico de DELPHI: programación de biblioteca de vínculos dinámicos (1)[3]

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

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