Constellation Knowledge Network - Conocimiento de chismes - ¿Qué es? archivo dll para?

¿Qué es? archivo dll para?

DLL es un archivo ejecutable especial. Es especial principalmente porque no se puede ejecutar directamente y sólo se puede utilizar mediante llamadas dinámicas mediante programas host como *. Programa EXE u otro dll. En pocas palabras, una DLL suele ser un conjunto compilado de funciones y procedimientos.

Hay varias razones principales para utilizar la tecnología DLL:

Primero, reducir el tamaño del archivo ejecutable.

El motivo de la tecnología DLL es reducir el tamaño de los archivos ejecutables. Cuando el sistema operativo entró en la era Windows, su tamaño alcanzó decenas de megabytes o incluso cientos de megabytes. Imagínese, si todavía estuviéramos usando un único sistema de archivos ejecutable en la era DOS, el tamaño de un archivo ejecutable podría alcanzar decenas de megabytes, lo cual es inaceptable para todos. La solución es utilizar tecnología de enlace dinámico para dividir un archivo ejecutable grande en muchos programas ejecutables pequeños.

En segundo lugar, darse cuenta del disfrute de los recursos.

Los recursos aquí * * * incluyen muchos aspectos, la mayoría de los cuales son memoria * * *, código * * *, etc. Los primeros programadores a menudo se encontraban con esta situación al escribir el mismo código en diferentes tareas de programación. Obviamente, este enfoque hace perder mucho tiempo y la gente ha escrito varias bibliotecas para resolver este problema. Sin embargo, debido a los diferentes lenguajes y entornos de programación, estas bibliotecas generalmente no son universales. Los usuarios las necesitan cuando ejecutan programas, lo cual es extremadamente inconveniente. La aparición de DLL es como formular un estándar para dar a estas bibliotecas especificaciones unificadas. De esta manera, los programadores de diferentes lenguajes de programación pueden utilizar fácilmente archivos DLL escritos en otros lenguajes de programación. Además, otra característica sobresaliente de DLL es que solo se carga una vez en la memoria, lo que puede ahorrar memoria limitada y atender múltiples procesos al mismo tiempo.

En tercer lugar, es fácil de mantener y actualizar.

Los amigos más cuidadosos pueden encontrar que algunos archivos DLL tienen descripciones de versión. (Puede saberlo mirando las propiedades del archivo DLL. No todos los archivos DLL las tienen). Esto es para facilitar el mantenimiento y las actualizaciones. Por ejemplo, hubo un error en Win95 a principios de 1995. El 29 de febrero de un año bisiesto no se pudo mostrar correctamente. Posteriormente, Microsoft lanzó un parche para corregir este ERROR. Vale la pena mencionar que no reinstalamos Win95, sino que reemplazamos la versión anterior de la DLL con la nueva versión. (No recuerdo qué archivo DLL es. Otro ejemplo común es la actualización del controlador. Por ejemplo, el famoso DirectX, después de muchas actualizaciones, ahora se ha desarrollado a la versión 6.0. Aún mejor, cuando intentamos instalar una versión inferior de DLL, el El sistema nos dará un mensaje para evitar errores humanos. Por ejemplo, cuando actualizamos un controlador de hardware, a menudo nos encontramos con que Windows nos indica que el controlador instalado actualmente es más antiguo que el controlador original.

Cuarto, relativamente seguro.

La seguridad mencionada aquí también incluye muchos aspectos, por ejemplo, la probabilidad de que los archivos DLL sean atacados por virus es mucho menor que la de los archivos EXE normales. es vulnerable a algunos "expertos". trae ciertas dificultades de desmontaje.

El segundo capítulo es escribir DLL superior usando Delphi.

Nota: supongo que el lector está usando Delphi 3. o Delphi 4. Como se mencionó en el comentario inicial, es hora de ir al grano. De hecho, escribir una DLL no es difícil, solo preste atención a algunas cosas. Para explicarlo, tomemos un ejemplo.

Biblioteca Delphi

p>

Usando

SysUtils,

Clase;

Función TestDll(I:entero ):integer; stdcall

Inicio

Resultado:= I;

Fin;

Salir

TestDll

Inicio

Fin.

¿Es el ejemplo anterior muy simple? Los amigos que están familiarizados con Delphi pueden ver que el código anterior es básicamente el mismo que el general. Programa Delphi, excepto que se agrega un parámetro stdcall después de la función TestDll. La declaración de exportaciones declara la función TestDll. Siempre que compile el código anterior, puede obtener una biblioteca de enlaces dinámicos llamada Delphi.dll. En primer lugar, el parámetro de llamada stdcall debe agregarse a la función o proceso escrito en el parámetro DLL .call en entornos Delphi 1 o Delphi 2. Después de Delphi 3, este parámetro se cambió a stdcall. para que se utilicen técnicas de paso de parámetros estándar de Win32 en lugar de parámetros de registro optimizados. Es un error común olvidarse de usar el parámetro stdcall. No afectará la compilación y generación de la DLL, pero se producirán errores graves al llamar a esta DLL, lo que provocará. el sistema operativo se bloquea. La razón es que los parámetros de registro son los parámetros predeterminados de Delphi.

En segundo lugar, la declaración de exportaciones debe usarse para escribir. Las funciones y procedimientos se declaran como funciones externas. >

Como puede ver, la función TestDll se declara como una función externa. Esto se hace usando la función "Vista rápida" del botón derecho del mouse. (Si no tiene la opción Vista rápida, puede instalarla desde el CD de Windows.

La función TestDll aparecerá en la columna de la tabla de exportación. Otra buena razón es que si no lo declaramos así, la función que escribimos no será llamada, que es algo que no queremos ver.

En tercer lugar, cuando utilice parámetros y variables de tipo cadena larga, consulte ShareMem.

El tipo de cadena en Delphi es muy poderoso. Sabemos que la longitud máxima de una cadena normal es de 256 caracteres, pero el tipo de cadena en Delphi puede alcanzar 2G de forma predeterminada. Sí, has leído bien, de hecho son dos billones. ) En este momento, si insiste en utilizar parámetros, variables o incluso información de registro de tipo cadena, debe hacer referencia a la unidad ShareMem y debe ser la primera referencia. Es la primera unidad a la que se hace referencia después de la declaración de usos. Por ejemplo:

Usa

ShareMem

SysUtils,

clase;

Una cosa más, deberías Haga el mismo trabajo en su archivo de proyecto (*). dpr) en lugar de archivos unitarios (*.pas). Este punto no está claramente indicado en el archivo de ayuda que viene con Delphi, lo que provoca muchos malentendidos. Si no lo hace, probablemente pagará el precio con un accidente. La forma de evitar el uso de tipos de cadena es declarar parámetros, variables, etc. Una cadena de tipo Pchar o ShortString (por ejemplo, s:string[10]). El mismo problema ocurrirá al usar matrices dinámicas y la solución es la anterior.

El Capítulo 3 llama estáticamente a DLL top en Delphi.

Llamar a una DLL es más fácil que escribir una DLL. Primero, les presentaré el método de llamada estática. Más adelante, presentaré el método de llamada dinámica y haré una comparación entre los dos métodos. De manera similar, primero demos un ejemplo de llamadas estáticas.

Unidad unidad 1;

Conexión

Uso

Ventana, mensaje, sistema, clase, gráficos,

Controles, formularios, cuadros de diálogo, controles estándar.

Tipo

TForm1 = clase(TForm)

edición 1:TEdit;

botón 1:TButton;

Botón de programa 1 clic (Remitente:al objeto);

Privado

{Declaración privada}

Público

{Declaración pública}

Fin;

Definir variables

formulario 1:t formulario 1;

Rendimiento

{$R *. DFM}

//El código debajo de esta línea es el código que realmente comenzamos a escribir.

Función TestDll(I:integer):integer; stdcall

Externo "Delphi.dll";

Programa TForm1. Botón1Hacer clic(remitente:al objeto);

Iniciar

Editar1. texto:= IntToStr(TestDll(1));

Fin;

Fin.

En el ejemplo anterior, colocamos un cuadro de edición y un botón en el formulario, y escribimos un pequeño código para probar el Delphi.dll que acabamos de escribir. Como puede ver, lo único que hicimos fue colocar la parte de descripción de la función TestDll en la implementación y especificar la ubicación de Delphi.dll con una declaración externa. (En este ejemplo, el programa que llama y Delphi.dll están en el mismo directorio). Lo interesante es que Delphi reconoció rápidamente la función TestDll que escribí. Puede hacer un experimento: ingrese "TestDll(", y pronto Delphi le mostrará un mensaje emergente, tal como usamos otras funciones definidas en Delphi. Las notas son las siguientes

Siguiente:

p>

Primero, use parámetros stdcall

Como se mencionó anteriormente, los parámetros stdcall también deben usarse al hacer referencia a funciones y procedimientos en una DLL, por las mismas razones que antes. use la declaración externa para especificar la ruta y el nombre del archivo DLL que se llamará.

Como puede ver, especificamos el nombre del archivo DLL que se llamará en la ruta externa. El archivo está en el mismo directorio que el programa principal que lo llama. Si el archivo DLL está en C:\, podemos escribir la declaración de referencia anterior como 'C:\Delphi.DLL' externo. Tenga en cuenta que se debe escribir el sufijo. dll del archivo.

En tercer lugar, las variables globales no se pueden llamar desde la DLL

Si declaramos algunas variables globales en la DLL, como por ejemplo: var s:byte, el archivo global. variable S. Se puede usar normalmente en la DLL, pero la persona que llama no puede usar S, lo que significa que S no se puede pasar a la persona que llama como una variable global. Sin embargo, las variables declaradas en el programa que llama se pueden pasar a la DLL. como parámetros.

4. La DLL llamada debe existir.

Esto es muy importante. Cuando se utiliza el método de llamada estática, debe existir el archivo DLL que se llama, la función o procedimiento que se llamará, etc. Si no existe o la ruta especificada y el nombre del archivo son incorrectos, el sistema indicará "Error al iniciar el programa" o "No*". Se encontró un "archivo dll" al ejecutar el programa principal.

Capítulo 4 Llama dinámicamente a la DLL top en Delphi.

La llamada dinámica de DLL es relativamente compleja, pero muy flexible. Para ilustrar completamente este problema, esta vez damos un ejemplo de cómo llamar a una DLL escrita en C++. Primero, compile el siguiente programa fuente DLL en C++.

#Include

extern "C" _declspec(dllexport)

int WINAPI TestC(int i)

{

Regresar I;

}

Después de la compilación, se genera un archivo DLL, al que aquí llamamos Cpp.dll. Solo hay una función en la DLL que devuelve un tipo entero, TestC c. Para facilitar la explicación, todavía nos referimos al programa de llamada anterior, pero reemplazamos las declaraciones originales en el proceso Button1Click con el siguiente código.

Programa TForm1. Button1Click(remitente:al objeto);

Tipo

tint func = function(I:integer):integer

Definir variables

<; p>th:Thandle;

TF:tint func;

TP:TFarProc;

Inicio

th:= LoadLibrary (' CPP . dll '); {Cargar DLL}

Si Th & gt entonces 0

Intente

Tp:=GetProcAddress(Th, PChar(' TestC '). ));

Si Tp & lt& gtNinguno

Entonces comience

TF:= tint func(Tp);

Editar1. text:= IntToStr(Tf(1)); {Llamar a la función TestC}

Fin

Otros

ShowMessage("Función TestC no encontrada");

Final

Biblioteca gratuita (Th); {Liberar DLL}

Fin

Otro

Mensaje en pantalla ( "CPP.dll no encontrado");

Fin;

Como puede ver, esta tecnología de llamadas dinámicas es muy complicada, pero la DLL llamada se puede modificar modificando los parámetros. Cambios dinámicos, como cambiar el nombre de la DLL ('Cpp.dll') en LoadLibrary a 'Delphi.dll'.

Primero, defina el tipo de función o procedimiento a llamar.

En el código anterior, definimos un tipo TIntFunc, que corresponde a la función TestC que llamaremos. El mismo trabajo de definición debería realizarse en otros casos de convocatoria. Y también se agregó el parámetro stdcall.

En segundo lugar, libere la DLL llamada.

Usamos LoadLibrary para llamar dinámicamente una DLL, pero recuerde que la DLL debe liberarse manualmente con FreeLibrary después de su uso; de lo contrario, la DLL ocupará memoria hasta que salga de Windows o lo cierre.

Ahora evaluemos las ventajas y desventajas de los dos métodos de llamar a DLL. El método estático es simple de implementar, fácil de dominar, generalmente un poco más rápido y más seguro y confiable, mientras que el método estático no puede cargar y descargar de manera flexible la DLL requerida en tiempo de ejecución, pero carga la DLL especificada al comienzo del programa principal y; no lo carga hasta el final del programa Libera la DLL. Además, sólo los sistemas basados ​​en compiladores y enlazadores como Delphi pueden utilizar este enfoque. El método dinámico resuelve las deficiencias del método estático y puede acceder fácilmente a funciones y procedimientos en la DLL, incluso a algunas funciones o procedimientos recién agregados en la versión anterior de la DLL. Pero los métodos dinámicos son difíciles de dominar por completo porque diferentes funciones o procedimientos necesitan definir muchos tipos complejos y métodos de llamada. Para los principiantes, les sugiero que utilicen primero el método estático y luego utilicen el método de llamada dinámica cuando dominen.

Capítulo 5: Consejos prácticos para usar DLL top

Primero, habilidades de escritura.

1. Para garantizar la exactitud de la DLL, se puede escribir como parte de una aplicación normal y luego separarla del programa principal después de la depuración y compilarla en una DLL.

2. Para asegurar la versatilidad de la DLL, se deben eliminar los nombres de los controles visuales de la DLL que escribimos, como por ejemplo el nombre de Edit1 en Edit1. Texto; o tipos personalizados no definidos por Windows, como registros.

3. Para facilitar la depuración, cada función y programa debe ser lo más breve y claro posible, con comentarios específicos y detallados.

4.try-finally debería usarse más para manejar posibles errores y excepciones. Tenga en cuenta que en este momento se debe hacer referencia a la unidad SysUtils.

5. Haga referencia a unidades lo menos posible para reducir el tamaño de la DLL, especialmente no haga referencia a unidades visuales como cuadros de diálogo. Por ejemplo, en circunstancias normales, no se puede hacer referencia a la unidad Clases, lo que puede reducir el archivo DLL compilado a aproximadamente 16 Kb.

En segundo lugar, llama a las habilidades.

1. Al utilizar métodos estáticos, puede cambiar el nombre de la función o procedimiento llamado. En el ejemplo de DLL escrito en C++ mencionado anteriormente, si se elimina la declaración externa "C", C++ compilará algunos nombres de funciones extraños. La función TestC original se llamará @TestC$s, etc. Esto se debe a que C++ adopta la manipulación de nombres de C+. tecnología. Este nombre de función es ilegal en Delphi. Podemos resolver este problema de esta manera:

Reescribir la función de referencia como

Función TestC(i:integer): stdcall

. p>

Externo "CPP .dll"; nombre "@TestC$s";

El nombre se utiliza para cambiar el nombre.

2. Podemos poner la DLL que escribimos en el directorio de Windows o en el directorio Windows\system. Puede escribir el nombre de la DLL en lugar de la ruta en la declaración externa o en la declaración LoadLibrary. Sin embargo, hay una gran cantidad de archivos DLL importantes del sistema en estos dos directorios. Si el archivo DLL que compila tiene el mismo nombre que ellos, las consecuencias serán desastrosas. Además, ¡sus habilidades de programación no son suficientes para colocar su propio dll en el directorio del sistema!

En tercer lugar, habilidades de depuración.

1. Sabemos que la DLL no se puede ejecutar y depurar en un solo paso al escribir. Una forma es configurar un programa host en el menú Ejecutar|Parámetros. Agregue el nombre del programa host en la columna de la aplicación host de la página local para realizar operaciones, observación de puntos de interrupción y depuración en un solo paso.

2. Agregue información de la versión de DLL. La introducción mencionó que la información de la versión es muy importante para las DLL. Si se incluye información de la versión, el tamaño de la DLL aumentará en 2 Kb. Vale la pena agregar este pequeño espacio. Desafortunadamente, no podemos usar directamente la opción Versión en el menú Proyecto|opciones y no se menciona en el archivo de ayuda de Delphi. Después de la investigación del autor, solo necesitamos agregar una línea de código. Por ejemplo:

Biblioteca Delphi

Usando

SysUtils,

Clase;

{$R *. RES}

//Tenga en cuenta que la línea de código anterior debe agregarse en esta ubicación.

Función TestDll(I:integer):integer; stdcall

Inicio

Resultado:= I;

Fin;

Salir

TestDll

Inicio

Fin.

3. Para evitar tener el mismo nombre que otros dll, es mejor mezclar caracteres y números con guiones bajos al nombrar su propio dll. Como JL _ try16.dll

4. Si ha compilado algunas DLL en Delphi 1 o Delphi 2, la DLL que compiló originalmente es de 16 bits. Siempre que vuelva a compilar el código fuente en el nuevo entorno Delphi 3 o Delphi 4, puede obtener una DLL de 32 bits.

[Posdata]: Además de los métodos más utilizados para usar DLL presentados anteriormente, DLL también se puede utilizar como portador de recursos. Por ejemplo, el cambio de iconos en Windows se realiza utilizando recursos en una DLL. Además, dominar la tecnología de diseño de DLL es beneficioso para el uso de programación OLE, COM y ActiveX más avanzada.

上篇: Las 10 novelas de viajes más populares con más clics 下篇: ¿Quiénes son las 10 principales personas que se mudaron a China en 2006?
Artículos populares