1. Comience su primer proyecto DLL
1.File-> Cerrar all-> file-> nuevo [dll >
Código : |
// Generar automáticamente el código de la siguiente manera Proyecto de biblioteca2; // Esto no tiene sentido. usos Sysutils, Clases; {$ R *.res} Comenzar fin. |
2. Agregue un func para ingresar:
Código : |
Proyecto de biblioteca2; usos Sysutils, Clases; Función mymax (x, y: entero): entero; Comenzar Si x> y entonces Resultados: = x demás Resultados: = y; fin ; // Recuerde: el nombre de la biblioteca no importa, pero el caso de DLL-Func está relacionado. // Escribir mymax en dll-func-name es diferente de mymax. Si se escribe mal, inmediatamente // El resultado es que solicita que el AP que use esta DLL no se pueda abrir en absoluto. // La caja superior y minúscula de los parámetros está bien. Ni siquiera tiene que tener el mismo nombre. Si el prototipo es (x, y: entero) // escríbalo como (a, b: entero) en el tiempo, está bien. // Recuerda: Agregue otro stdcall. El libro dice que si está escribiendo dlls usando Delphi, y espera no solo a // Si Delphi-AP también espera usar BCB/VC-AP, etc., entonces será mejor que agregue un stdcall; // Patrón de parámetros: Delphi tiene muchos patrones variables, que, por supuesto, no son lo que DLL le gusta //, el idioma nativo de Windows/DLL debe ser C. Entonces, si queremos entrar y salir de los parámetros de la DLL, nosotros // use tanto como sea posible según las reglas. Si escribe estos dos, este último será mucho problema. Si no está familiarizado con C // Si está bien. Hablaremos de eso más tarde. {$ R *.res} Comenzar fin. |
3. Envíe estas funciones compartibles fuera de la DLL y deje que el mundo exterior (es su Delphi-AP) use: Guangru
Por lo tanto, su AP no puede usarlos, debe agregar exportaciones.
Código : |
{$ R *.res} exportaciones Mymax; Comenzar fin. |
4. Está bien, puede presionar CTRL-F9 para compilar. No presione F9 en este momento. DLL no es exe┌ que no se puede ejecutar por separado. Si la DLL tiene un error en este momento, corrijalo. Presione CTRL-F9 nuevamente. La advertencia puede estar allí en este momento, no importa, solo estudiarla y echar un vistazo. Presione CTRL-F9 nuevamente, y luego "Hecho, compilado". Habrá un *.dll en el mismo directorio. Felicitaciones, la tarea se realiza.
2. Realice una prueba: Abra una nueva aplicación:
1. Agregue un tbutton
Código : |
ShowMessage (intToStr (mymax (30,50))); |
2. Dile a Exe que vaya allí para atrapar un func
Código : |
// Agregar a la forma, interfaz, var Función mymax (x, y: entero): entero; // mytestdll.dll escribe el nombre del proyecto DLL para usted antes // No importa si el nombre de DLL es superior e inferior. Pero recuerde agregar extensión .dll. En win95 o nt, // No hay necesidad de agregar extensión, pero estos dos OSS pueden ser cada vez menos. Necesita agregar extensión. |
Ok, es simple.
¿El ejemplo anterior es muy simple? Los amigos que están familiarizados con Delphi pueden ver que el código anterior es básicamente el mismo que escribir un programa general de Delphi, excepto que hay un parámetro STDCall adicional después de la función testdll y la función testdll se declara utilizando la declaración de exportaciones. Simplemente compile el código anterior y puede obtener una biblioteca de enlaces dinámico llamada Delphi.dll. Ahora, veamos qué necesita atención. 1. Todas las funciones o procedimientos escritos en DLL deben agregarse con los parámetros de llamadas STDCall. En el entorno Delphi 1 o Delphi 2, el parámetro de llamada está lejos. Después de Delphi 3, este parámetro se cambió a STDCall, con el propósito de usar la tecnología de transferencia de parámetros Win32 estándar en lugar de los parámetros de registro optimizados. Olvidé usar el parámetro STDCall es un error común. La razón es que el parámetro de registro es el parámetro predeterminado de Delphi.
2. Las funciones y procedimientos escritos deben declararse como funciones externas utilizando la declaración de exportaciones.
Como puede ver, la función testdll se declara como una función externa. Esto permite que la función se vea externamente. (Si no hay una opción de vista rápida, puede instalarla desde un CD de Windows). La función testdll aparece en la barra de tabla de exportación. Otra buena razón es que si no declaramos de esta manera, las funciones que escribimos no se llamarán, que es algo que nadie quiere ver.
3. Cuando se utilizan parámetros y variables de tipo de cadena larga, se debe hacer referencia a Sharemem.
El tipo de cadena en Delphi es muy poderoso. (Sí, lo lees bien, de hecho son dos megabytes). En este momento, si insiste en usar un parámetro de tipo de cadena, variable o incluso información de grabación, debe consultar la unidad Sharemem, y debe ser la primera referencia . Es la primera unidad referenciada después de la declaración de usos. Como se muestra en el siguiente ejemplo:
usos
Sharemem,
Sysutils,
Clases;
Otro punto es que se debe hacer lo mismo en su archivo de proyecto (*.DPR) en lugar del archivo de la unidad (*.pas). Si no hace esto, es probable que pague un accidente. La forma de evitar usar el tipo de cadena es declarar parámetros, variables, etc. del tipo de cadena como PCHAR o TIPO DE CORTHTRING (como: S: String [10]). El mismo problema ocurre cuando usa matrices dinámicas, la solución es como se describe anteriormente.
Capítulo 3: Llamada estática a Dll Top en Delphi
Llamar a un DLL es más fácil que escribir una DLL. Primero, le presentaré el método de llamadas estáticas. Del mismo modo, primero damos un ejemplo de llamadas estáticas.
Unidad Unidad1;
interfaz
usos
Windows, mensajes, sysutils, clases, gráficos,
Controles, formularios, diálogos, stdctrls;
tipo
TForm1 = class (tForm)
Edit1: tedit;
Botón 1: tbutton;
procedimiento botón1Click (remitente: tobject);
Privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
varilla
Form1: tform1;
Implementación
{$ R *.dfm}
// El siguiente código en esta línea es el código que realmente escribimos
función testdll (i: entero): integer; stdcall;
externo 'delphi.dll';
procedimiento tForm1.Button1Click (remitente: tobject);
Comenzar
Edit1.text: = intToStr (testDll (1));
fin;
fin.
En el ejemplo anterior, colocamos un cuadro de edición (editar) y un botón en el formulario, y escribimos muy poco código para probar el Delphi.dll que acabamos de escribir. Puede ver que el único trabajo que hacemos es colocar la parte de descripción de la función testdll en la implementación y especificar la ubicación de Delphi.dll con la declaración externa. (En este ejemplo, el programa de llamadas y Delphi.dll están en el mismo directorio). Es emocionante que la función testdll que escribimos fue reconocida rápidamente por Delphi. Puede hacer un experimento como este: ingrese "testdll (", y pronto Delphi usará la barra de inmediato para solicitarle los parámetros que debe ingresar, tan simple como usar otras funciones definidas en Delphi. Las notas incluyen
Próximo:
1. Use stdcall para llamar a los parámetros.
Como se mencionó anteriormente, al referirse a funciones y procedimientos en DLL, también debe usar el parámetro STDCall, por la misma razón que se mencionó anteriormente.
2. Use la declaración externa para especificar la ruta y el nombre del archivo DLL llamado.
Como puede ver, especificamos el nombre del archivo DLL que se llamará en la declaración externa. No hay ruta de escritura porque el archivo DLL y el programa principal que lo llamó están en el mismo directorio. Si el archivo DLL está en c:/, podemos escribir la declaración de referencia anterior como externo 'c: /delphi.dll'. Tenga en cuenta que debe escribirse el sufix.dll del archivo.
3. No se pueden llamar a las variables globales desde la DLL.
Si declaramos algún tipo de variable global en la DLL, como: var s: byte. De esta manera, la variable global se puede usar normalmente en la DLL, pero el programa de llamadas no puede usar S, y S no puede aprobarse como una variable global para el programa de llamadas. Sin embargo, las variables declaradas en el programa de llamadas pueden aprobarse como parámetros a la DLL.
4. La dll llamada debe existir.
Esto es importante. Si la ruta especificada y el nombre del archivo no existen o la ruta especificada y el nombre del archivo son incorrectos, el sistema solicitará "ocurrió un error al iniciar el programa" o "no encontrado *.dll archivo" al ejecutar el programa principal.
CAPÍTULO 4 Llamando dinámicamente a DLL Top en Delphi
Llamar dinámicamente a DLL es relativamente complicado, pero muy flexible. Para ilustrar el problema a fondo, esta vez damos un ejemplo de llamar a una DLL escrita en C ++. Primero, compile el siguiente programa de fuente de DLL en C ++.
#incluir
extern "C" _DeclSpec (DLEXPORT)
int winapi testc (int i)
{
regresar i;
}
Después de la compilación, se genera un archivo DLL. En aras de la conveniencia, todavía nos referimos al programa de llamadas anterior, pero reemplazamos la instrucción original en el proceso de botón 1 de clic en el siguiente código.
procedimiento tForm1.Button1Click (remitente: tobject);
tipo
Tintfunc = function (i: integer): integer; stdcall;
varilla
Th: Thandle;
TF: tintfunc;
TP: tfarproc;
Comenzar
Th: = loadLibrary ('cpp.dll');
Si th> 0 entonces
intentar
Tp: = getProcaddress (th, pchar ('testc'));
Si tp <> nil
Entonces comienza
Tf: = tintfunc (tp);
Edit1.text: = intToStr (tf (1));
fin
demás
ShowMessage ('Función testc no encontrado');
Finalmente
Freelibrary (th);
fin
demás
ShowMessage ('cpp.dll no encontrado');
fin;
Como ha visto, esta técnica de llamadas dinámicas es muy complicada, pero siempre que modifique los parámetros, como modificar el nombre de dll en loadlibrary ('cpp.dll') para ser 'delphi.dll', puede cambiar dinámicamente el llamado dll.
1. 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 vamos a llamar. El mismo trabajo de definición debe hacerse en otras llamadas. Y también agregue los parámetros de llamadas STDCall.
2. Libera el llamado DLL.
Llamamos a una DLL dinámicamente con LoadLibrary, pero recuerde que debe liberar manualmente la DLL con Freelibrary después de su uso, de lo contrario, la DLL tomará la memoria hasta que salga de Windows o se apague.
Ahora evaluemos las ventajas y desventajas de los dos métodos para llamar a DLL. El método estático es fácil de implementar, fácil de dominar y generalmente un poco más rápido, y es más seguro y más confiable; Para ejecutarse hasta que la DLL se lance solo al final del programa, y solo los sistemas basados en compiladores como Delphi pueden usar este método. Los métodos dinámicos resuelven mejor las deficiencias en los métodos estáticos, y pueden acceder fácilmente a las funciones y procedimientos en DLL, e incluso a las funciones o procedimientos recién agregados en algunas versiones antiguas de DLL, sin embargo, los métodos dinámicos son difíciles de dominar, debido a diferentes usos. La función o el procedimiento deben definir muchos tipos complejos y métodos de llamadas. Para los principiantes, el autor recomienda que use métodos estáticos y luego use métodos de llamadas dinámicas después de ser competente.
Capítulo 5 Consejos prácticos para usar DLL Top
1. Habilidades de escritura.
1. Para garantizar la corrección de la DLL, primero puede escribirlo como parte de una aplicación ordinaria, depurarla correctamente y luego separarla del programa principal y compilarlo en DLL.
2. Para garantizar la universalidad de la DLL, debe evitar que los nombres de los controles visuales aparezcan en la DLL que escribió usted mismo, como: Edit1 Nombre en Edit1.Text; algún récord.
3. Para facilitar la depuración, cada función y proceso debe ser lo más corto y conciso posible, y debe ir acompañado de anotaciones específicas y detalladas.
4. Try-Finalmente debe usarse para tratar posibles errores y excepciones.
5. Referencia tan pocas unidades como sea posible para reducir el tamaño de la DLL, especialmente no se refieren a unidades visuales, como las unidades de diálogo. Por ejemplo, en general, no podemos hacer referencia a las unidades de clases, lo que puede reducir la DLL compilada en aproximadamente 16 kb.
2. Habilidades de llamadas.
1. Al usar 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 instrucción "C" externa, C ++ compilará algunos nombres de funciones extrañas, y la función TESTC original se nombrará @testc $ s y otros nombres ridículos extraños. Utiliza la tecnología de mangling de nombre C ++. Este nombre de función es ilegal en Delphi, podemos resolver este problema como este:
Reescribir la función de referencia como
función testc (i: entero): integer; stdcall;
externo 'cpp.dll'; nombre '@testc $ s';
La función del nombre es cambiar el nombre.
2. Puede colocar las DLL que escribimos en el directorio de Windows o en el directorio de Windows/Sistema. Hacerlo puede escribir solo el nombre de la DLL sin escribir la ruta en la declaración externa o en la declaración de carga de carga. Pero es un poco inapropiado hacer esto. ¡Pon las dlls que te escribiste en el directorio del sistema!
3. Habilidades de depuración.
1. Sabemos que DLL no se puede ejecutar y depurar paso a paso al escribir. Hay una manera de hacer esto, es decir, configurar un programa de host en el menú Run | Parámetros. Agregue el nombre del programa de host a la barra de aplicación de host de la página local para realizar la depuración paso a paso, la observación del punto de interrupción y la ejecución.
2. Agregar información de la versión DLL. Las observaciones de apertura mencionaron que la información de la versión es muy importante para DLL. Vale la pena agregar un poco de espacio. Desafortunadamente, no es posible usar la opción de versión en el menú de opciones del proyecto. Como se muestra en el siguiente ejemplo:
Biblioteca Delphi;
usos
Sysutils,
Clases;
{$ R *.res}
// Tenga en cuenta que la línea de código anterior debe agregarse en esta posición
función testdll (i: entero): integer; stdcall;
Comenzar
Resultados: = i;
fin;
exportaciones
Testdll;
Comenzar
fin.
3. Para evitar duplicar los nombres con otros DLL, es mejor usar una mezcla de caracteres, números y subrayos al nombrar las DLL que escribe. Por ejemplo: jl_try16.dll.
4. Si ya ha compilado algunas DLL en Delphi 1 o Delphi 2, la DLL que compiló es de 16 bits. Simplemente recompire el código fuente en el nuevo entorno Delphi 3 o Delphi 4 y puede obtener una DLL de 32 bits.
[Después de la nota]: además de los métodos más utilizados para usar DLL introducidos anteriormente, los DLL también se pueden usar como portadores de recursos. Por ejemplo, cambiar los iconos en Windows es el recurso en la DLL utilizada. Además, haber dominado la tecnología de diseño DLL tiene muchos beneficios para usar programación OLE, COM y ActiveX más avanzada.