Creación de un archivo DLL de Windows con Visual Basic
by Ron Petrusha 04/26/2005
Como la primera lengua desarrollo rápido de aplicaciones, Visual Basic llamado la atención por su elegante interfaz gráfica y facilidad de uso, lo que permitió un programador con poca experiencia para llevar a cabo en cuestión de minutos lo que a menudo tomó días para programadores avanzados utilizando lenguajes como C y C + +. Como resultado, Visual Basic atrajo a millones de nuevos programadores, muchos de los cuales tal vez nunca han siquiera considerado la programación de no haber sido por la sencillez del lenguaje. Debido a esta simplicidad, y porque Visual Basic fue atrayendo un público que los proponentes de otras lenguas sólo podían soñar, la no-programadores de Visual Basic (que eran real mente verde de envidia) contraatac contraa tacó ó señalando a la inexperiencia inexperiencia de la mayoría de los programadores de Visual Basic y al los problemas que se derivan de la meta de diseño de Visual Basic de blindar el revelador de las complejidades del sistema operativo subyacente. Para reforzar su argumento de que Visual Basic es insuficiente y poco desarrollados, los críticos le gustaba señalar las muchas cosas "reales" que los programadores hacen los programadores de Visual Basic no se puede. Tal vez la limitación más común que los críticos señalan continuamente es la incapacidad de Visual Basic para crear una biblioteca estándar de Windows de enlace dinámico (DLL). Ciertamente es verdad que fuera de la caja, Visual Basic no permite crear un archivo DLL de Windows de la misma manera que se pueden crear otros tipos de proyectos, como un EXE estándar o un archivo DLL de ActiveX. En este artículo vamos a ir a explorar para ver cómo Visual Basic genera sus archivos ejecutables. En el proceso, vamos a descubrir que con un poco de trabajo extra, podemos, de hecho, crear archivos DLL de Windows con Visual Basic.
¿Qué es una biblioteca de Windows Dynamic Link?. Una
librería de enlace dinámico (DLL) es una biblioteca de funciones y procedimientos que se puede
llamar desde una aplicación o archivo DLL otro.
U so
de una biblioteca de esta forma tiene dos
funciones principales: * Permite el intercambio de código. El mismo archivo DLL puede ser utilizada por muchos otros archivos DLL y las aplicaciones. aplicaciones. La API de Win32, por ejemplo, ejemplo, se i mplementa como una serie d e archivos DLL de Windows. Por Por otra parte, siempre y c uando varios procesos procesos de carga de la misma DLL en la misma dirección base, pueden compartir el código en el a rchivo DLL. En otras palabras, una única DLL en la memoria se puede acceder por var ios procesos. * Se permite el des arrollo basado basado en componentes y modular, lo que hace que el desarrollo y el proceso de actualización sea más fácil. Normalmente, cuando una biblioteca estática se utiliza en el desarrollo de aplicaciones, los módulos de la biblioteca debe estar vinculada a la aplicación final. Con la vinculación dinámica, los módulos módulos pueden residir en un archivo independiente DLL que se carg a de forma dinámica, ya sea cuando se carga la aplicación aplicación o cuando sus funciones miembro son necesarios. Una
librería de enlace dinámico pueden incluir funciones funciones internas, que sólo se puede llamar desde
dentro de la DLL. Su objetivo principal, principal, sin sin embargo, es proporcionar funciones funciones exportadas - es decir, funciones funciones que residen en un módulo de la DLL y se puede llamar desde o tros archivos DLL y las aplicaciones. aplicaciones. Con frecuencia, frecuencia, una definición definición (. Def) del ar chivo se utiliza utiliza en C / C + + a la lista de las exportaciones de un archivo DLL.
Un
archivo DLL también incluye un punto de entrada opcional, que se llama cuando se carga un
proceso o subproceso o descarga el archivo DLL. Windows llama a este p unto de en trada cuando se carga un proceso y descarga el archivo DLL. También llama a la puerta de entrada cuando el proceso crea o termina un hilo. Eso permite que el archivo DLL para realizar cualquiera por proceso y la inicialización de cada aplicación y limpieza. La sintaxis de este punto de entrada, que debe utilizar la convención de llamada es tándar (usado por defecto en Visual Basic), es:
Public Function DllMain(hinstDLL As Long, fdwReason As Long, lpwReserved As Long) As Boolean
los Parámetros son:
hInstDLL , es un long que contiene el identificador de instancia de la DLL. Este es el mismo módulo de la DLL de manejar. fdwReason, una constante que indica por qué el punto de entrada ha sido llamado. Los valores
posibles son:
DLL_PROCESS _ATTA CH (1) Un
proceso se está cargando el archivo DLL. Cualquier inicialización por proceso se debe realizar.
DLL_THRE AD_ATTA CH (2) El proceso está g enerando un nuevo hilo. C ualquier inicialización por hilo debe ser realizada.
DLL_THRE AD_D ETA CH (3) Un
hilo es la salida. Cualquier limpieza por hilo debe ser realizada.
DLL_PROCESS _DETA CH (0) Un
proceso es extraer el archivo DLL, o el proceso está saliendo. Cualquier limpieza por proceso se
debe realizar. lpvReserved
Es
un
long
que
proporciona
más
información
acerca
de DLL_PROCESS_ATTACH
DLL_PROCESS_DETACH(que proporciona más información acerca de fdwReason DLL_THREAD_ATTACH
y es
o DLL_THREAD_DETACH .)
Si fdwReason es DLL_PROCESS_ATTACH, esto es nada para las bibliotecas cargadas dinámicamente utilizando funciones como LoadLibrary y GetProcAddress, y no es nada para las bibliotecas de carga estática por talones de la colección de proporcionar en tiempo de compilación. Si fdwReason es DLL_PROCESS_DETACH, no es nada si la llamada es el r esultado de una llamada a la función de Win32 FreeLibrary, y no es nada si el punto de entrada se llama durante la terminación del proceso.
El valor de retorno de la función sólo tiene sentido si es fdwReason DLL_PROCESS_ATTACH. Si la inicialización se realiza correctamente, la función debe devolver True, de lo contrario, debe devolver false. Tenga en cuenta que debido a que la función es un punto de entrada llamada por Windows, los valores de los argumentos pasados a la función son proporcionados por Windows. Además, el punto de
entrada no se llama cuando un hilo se termina con la función de Win32 TerminateThread, ni se llama cuando un proceso se termina con la función de Win32 TerminateProcess. El valor de retorno de la función sólo t iene sentido si es fdwReason DLL_PROCESS_ATTACH. Si la inicialización se realiza correctamente, la función debe devolver True, de lo contrario, debe devolver false. Tenga en cuenta que debido a que la función es un punto de entrada llamada por Windows, los valores de los argumentos pasados a la función son proporcionados por Windows. Además, el punto de entrada no se llama cuando un hilo se termina con la función de Win32 TerminateThread, ni se llama cuando un proceso se termina con la función de Win32 TerminateProcess. El Código DLL
En el intento de desarrollar una DLL de Windows, vamos a crear una biblioteca muy simple de funciones matemáticas. El siguiente es el código del archivo DLL, que vamos a almacenar en un módulo de código (un archivo bas.) llamado MathLib:
Op tion Explicit
Pub lic Pub lic Pub lic Pub lic
Const Const Const Const
DLL_PROCESS _DETA CH = 0 DLL_PROCESS _ATTA CH = 1 DLL_THRE AD_ATTA CH = 2 DLL_THRE AD_DETA CH = 3
Pub lic Function DllMain(hInst As Long, fdwRea son As Long, lpvReserved As Long) As Boolean Sele ct Case fdwReason Case DLL_PROCESS _DETA CH ' No per-pr ocess cleanu p needed Case DLL_PROCESS _ATTA CH DllMain = True Case DLL_THRE AD_ATTA CH ' No per- thread initialization needed Case DLL_THRE AD_DETA CH ' No per-thread clea nu p needed End Select End Function Pub lic Function Increment (var As Integer) As Int eger If N ot Is Nu meric(var) Then Err.Ra ise 5 Increment = var + 1 End Function Pub lic Function Decrement (var As Integer) As Int eger If N ot Is Nu mer ic(var) Then Err.Ra ise 5 Decrement = var - 1 End Function Pub lic Function Sq uare(var As Long) As Long If N ot Is Nu meric(var) Then Err.Ra ise 5 Sq uare = var ^ 2 End Function
varias características sobre el código vale la pena mencionar. La primera es que a pesar de que incluye un procedimiento DllMain, ningún proceso o por la inicialización por subproceso debe realizarse. Así DllMain simplemente devuelve True si se le llama con el argumento de fdwReason establece DLL_PROCESS_ATTACH. En segundo lugar, el punto de proporcionar un archivo DLL de Windows es permitir a otros idiomas para llamarlo. Para garantizar la interoperabilidad, queremos limitarnos a las características del lenguaje que la API de Win32 admite, por lo que nuestra DLL se puede llamar desde los entornos de desarrollo y muchas plataformas como sea posible. Podríamos haber hecho cada uno de nuestros tres funciones matemáticas más flexible, por ejemplo, mediante la definición tanto en el argumento de entrada y el valor de retorno como variantes. Eso habría permitido a la función para determinar el tipo de datos se deben interpretar los da tos de entrada como, además del tipo de datos se debe devolver. Sin embargo, la variante es un tipo de datos definidos por el COM, de componentes de Microsoft Modelo de objetos, y no es un tipo de datos de la API Win32 reconoce. Así que en lugar, el código utiliza el estándar de Win32 API de tipos de datos. También necesitará un programa de prueba que nos diga si nuestra DLL de Windows funciona correctamente. Para ello, se puede crear un proyecto EXE estándar con una forma y un módulo de código. El módulo de código consiste simplemente en las instrucciones Declare que definen las funciones que se encuentran en el archivo DLL:
Pub lic Declare Function Inc reme nt Lib "Ma thLib.dll" (var As Integer) As Int eger Pub lic Declare Function Decreme nt Lib "Ma thLib.dll" (var As Integer) As Int eger Pub lic Declare Function Sq uare Lib "MathLib.dll" (var As Long ) As Long
En lugar de simplemente especificando el nombre del archivo DLL en la cláusula Lib, también debe agregar la ruta completa al directorio que contiene el archivo DLL. El código del formulario realiza las lla madas a las funciones DLL:
Option Explicit Dim incr As Integer Dim decr As Integer Dim sqr As Long Private Sub cmdDecrement_Click() decr = Increment(decr) cmdDecrement.Caption = "x = " & CStr(decr) End Sub Private Sub cmdIncrement_Click() incr = Increment(incr) cmdIncrement.Caption = "x = " & CStr(incr) End Sub Private Sub cmdSquare_Click() sqr = Square(srr)
cmdSquare.Caption = "x = " & CStr(sqr) End Sub Private Sub Form_Load() incr = 1 decr = 100 sqr = 2 End Sub
El DLL de ActiveX Tipo de Proyecto
Comencemos por crear un proyecto DLL ActiveX y ver lo que ocurre si tratamos de llamar como si fuera una norma DLL de Windows. Al crear un proyecto DLL ActiveX, Visual Basic agrega automáticamente un módulo de clase (un archivo. cls) a la misma. Puede cambiar el nombre si desea, pero no incluye ningún código. En su lugar, agregue un módulo de código (un archivo. BAS) para el proyecto, agregar el código del archivo DLL y , a continuación, compile la DLL. Al ejecutar la aplicación de prueba DLL, el diálogo de mensaje de error que se muestra en la Figura 1 aparece. El mensaje de error indica que, aunque s e encontró el archivo DLL, la función específica llamada (incremento) no lo era.
Figura
1. Error al acceder a un archivo DLL de ActiveX como un archivo DLL de Windows
La causa más probable de este error es que la función no es exportadas por la DLL. Podemos utilizar la utilidad DUMPBIN para examinar las exportaciones de un archivo DLL m ediante el uso de la sintaxis
Dumpbin
/exports
Si corremos DumpBin utilizando esta sintaxis, podemos ver el siguiente resultado:
Microsoft (R) COFF Binary File Dumper Version 6.00.8447 Copyright (C) Microsoft Corp 1992 -1998. All rights reserved.
Dump of file mathlib.dll File Type: DLL Section contains the following exports for MathLib.dll 0 41B9E52C 0.00 1 4 4
characteristics time date stamp Fri Dec 10 10:04:28 2004 version ordinal base number of functions number of names
ordinal hint RVA 1 2 3 4
0 1 2 3
0000192E 00001902 00001918 000018EC
name DllCanUnloadNow DllGetClassObject DllRegisterServer DllUnregisterServer
Summary 1000 1000 1000 1000
.data .reloc .rsrc .text
Nuestras
exportaciones DLL cuatro funciones, todas las cuales son las funciones de utilidad que soporte COM. Es evidente que necesitamos para exportar DllMain y nuestros tres funciones matemáticas. Pero, ¿cómo? Visual Basic no parece que le permiten exportar funciones DLL de ActiveX DLL, por lo que efectivamente le impide el uso de Visual Basic para crear un estándar DLL de Windows.
Esta dificultad, sin embargo, no es insuperable. Cuando se selecciona el menú Archivo -.> Crear opción de menú dll para crear un archivo DLL de ActiveX, parece que Visual Basic es la perfección de tomar nuestro código fuente y la salida de un archivo DLL de ActiveX. Pero si examinamos el subdirectorio en el que Visual Basic se ha instalado, parece que el proceso no es tan perfecta. Junto con VB6.exe, el ejecutable de Visual Basic que define el entorno de Visual Basic, también podemos encontrar C2.EXE y LI NK .EXE, que es un compilador y un enlazador, respectivamente. Su presencia en este directorio sugiere que VB6.exe no se ocupa por si mismo de la generación de la DLL, pero que en algún momento en el proceso de compilación, se llama a estos programas. Podemos encontrar la manera de Visual Basic utiliza el compilador y enlazador más precisamente cambiando el nombre de ellos y crear ejecutables contenedor llamado C2 y LI NK que a su vez llamar al compilador y enlazador real. El siguiente es el código fuente de una nueva versión de un C2.EXE consola de modo que llama a la "real" del compilador C2, que hemos cambiado el nombre C2comp.exe:
Public Sub Main() On Error Resume Next Dim strCmd As String, strPath As String Dim oFS As New Scripting.FileSystemObject Dim ts As TextStream strCmd = Command strPath = App.Path Set ts = oFS.CreateTextFile(strPath & " \c2log.txt") ts.WriteLine "Beginning execution at " & Date & " " & Time() ts.WriteBlankLines 1 ts.WriteLine "Command line parameters to c2 call:" ts.WriteLine " " & strCmd ts.WriteBlankLines 1 ts.WriteLine "Calling C2 compiler" Shell "c2comp.exe " & strCmd If Err.Number <> 0 Then ts.WriteLine "Error in calling C2 compiler..." End If ts.WriteBlankLines 1 ts.WriteLine "Returned from c2 compiler call" ts.Close End Sub
El proceso de implantación de un archivo DLL ActiveX produce la siguiente salida en nuestro archivo de registro:
Beginning execution at 12/10/2004 12:44:22 PM Command line parameters to c2 call: -il "C:\DOCUME~1\Ron\LOCALS~1\Temp\VB277103" -f "C:\VB Projects \ MathLib\MathMod.bas" -W 3 -Gy -G5 -Gs4096 -dos -Zl -Fo"C:\ VB Projects\MathLib\MathMod.OBJ" -QIfdiv -ML -basic Calling C2 compiler Returned from c2 compiler call
Estos argumentos son bastante estándar de línea de comandos para generar archivos objeto que a su vez se suministran al vinculador. Eso significa que para determinar la manera de producir un archivo DLL de Windows, vamos a tener que interceptar la llamada al enlazador para que podamos ver lo que los argumentos de Visual Basic pasa a ella. El siguiente código hace lo siguiente:
Public Sub Main () On Error Resume Next Dim strCmd As String, strPath As String Como Scripting.FileSystemObject Dim OFS Nuevo Dim ts Como TextStream strCmd = Comando strPath = App.Path Establecer ct = oFS.CreateTextFile (strPath & "\ lnklog.txt") ts.WriteLine "A partir de la ejecución en"& Fecha & ""& Time () ts.WriteBlankLines un ts.WriteLine "parámetros de la línea de comandos para llamar a LI NK :" "ts.WriteLine" y strCmd ts.WriteBlankLines un ts.WriteLine "Calling vinculador LI NK " Shell "linklnk.exe" y strCmd Si 0 Then ts.WriteLine "Error en el vinculador llamando ..." Err.Clear End If ts.WriteBlankLines un ts.WriteLine "devolución de llamada del vinculador" ts.Close End Sub
Se requiere que cambie el nombre del LinkLnk.exe enlazador y el nombre de nuestro Link.exe contenedor
enlace.
Cuando tratamos de elaborar un proyecto DLL ActiveX, nuestro archivo de registro vinculador contiene el siguiente resultado: Beginning execution at 12/11/2004 12:44:33 PM Command line parameters to LINK call: "C:\Program Files \Microsoft Visual Studio \VB98\Class1.OBJ" "C:\Program Files \Microsoft Visual Studio \VB98\Project1.OBJ" "C:\Program Files \Microsoft Visual Studio \VB98\VBAEXE6.LIB" /ENTRY:__vbaS /OUT:"C:\Program Files \Microsoft Visual Studio \VB98\Project1.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /DLL /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 Calling LINK linker Returned from linker call
Si comparamos estos argumentos de la línea de comandos con la sintaxis necesaria para vincular los archivos objeto de una DLL usando C o C + +, una omisión se hace inmediatamente evidente. Aunque el modificador / DLL se suministra para crear un archivo DLL estándar, no hay modificador / DE F para definir una definición de módulo (. def) del arc hivo que se enumeran las funciones exportadas por la DLL. (Si se programa en C o C + +, podemos utilizar las declaraciones dentro de nuestro código para definir nuestras exportaciones. Visual Basic no es compatible con esto, sin embargo, por lo que la definición de archivo. el único medio de la definición de las exportaciones de la biblioteca.) Por otra parte, si examinamos los archivos generados por un proyecto DLL ActiveX por el entorno de Visual Basic, también encontrará que Visual Basic no se ha generado un archivo de definición..
Creación de la DLL de Windows Así, después de examinar la tabla un archivo DLL de ActiveX de exportación, interceptar llamadas de Visual Basic para el compilador, interceptar llamadas de Visual Basic para el enlazador, y la comparación de los argumentos pasados al vinculador con las exigidas a C / C + + para generar un archivo DLL de Windows, Por fin has identificado por las que no son capaces de crear c on éxito un archivo DLL de Windows con Visual Basic. Y afortunadamente, podemos evitar esa restricción. Debemos ser capaces de crear un estándar de archivo DLL de Windows si no hacemos lo siguiente: 1.
Cree un archivo. def para nuestro proyecto. Podemos especificar nuestras funciones
exportadas en el archivo de definición de varias m aneras, pero lo mejor es mantenerlo simple.: NAME MathLib LIBRARY MathMod DESCRIPTION "Add -on Library of Mathematical Routines" EXPORTS DllMain @1 Increment @2 Decrement @3 Square @4
La instrucción NA ME define el nombre de la DLL. La instrucción LIBRARY o debe preceder a la lista de funciones exportadas o aparecer en la misma línea que la primera función. El archivo de definición. También se enumerarán la posición ordinal de cada función exportada precedido por u n símbolo @. 2 Decidir cómo queremos p ara interceptar la llamada al enlazador. Dos técnicas principales son disponibles para hacer esto : El parcheo de las importaciones de tabla de dirección (IAT), que exige que se construye un Visual Basic complemento que modifica el TAI con el fin de interceptar llamadas en particular por Visual Basic para la API de Win32. Aunque es sin duda el método m ás elegante, su complejidad hace que sea un tema digno d e un artículo separado. La construcción de un enlazador proxy que intercepta la llamada al enlazador real, modifica los argumentos de línea de comandos para pasa r al enlazador, y luego llama al enlazador con los argumentos correctos de línea de comandos. Este es el enfoque que utiliza para descubrir lo que los argumentos de Visual Basic se pasa al compilador y enlazador, y es el enfoque que v a a adoptar para crear un archivo DLL de Windows.
En la construcción de nuestro enlazador proxy, queremos un diseño lo suficientemente flexible para que podamos generar otros tipos de archivos, en caso necesario.
3 Modificar los argumentos par a el enlazador para agregar el / DEF interruptor junto a la ruta y el nombre de nuestro archivo def.. Para ello, debe crear un estándar de Visual Basic proyecto EXE, agregue una referencia al Microsoft Scripting Runtime Library, quitar el formulario del proyecto, y añadir un módulo de código. El código fuente para e l enlazador proxy es la siguiente:.
Option Explicit Public Sub Main() Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim
SpecialLink As Boolean, fCPL As Boolean, fResource As Boolean intPos As Integer strCmd As String strPath As String strFileContents As String strDefFile As String, strResFile As String oFS As New Scripting.FileSystemObject fld As Folder fil As File ts As TextStream, tsDef As TextStream
strCmd = Command Set ts = oFS.CreateTextFile(App.Path & " \lnklog.txt") ts.WriteLine "Beginning execution at " & Date & " " & Time() ts.WriteBlankLines 1 ts.WriteLine "Command line arguments to LINK call:" ts.WriteBlankLines 1 ts.WriteLine " " & strCmd ts.WriteBlankLines 2 ' Determine if .DEF file exists ' ' Extract path from first .obj argument intPos = InStr(1, strCmd, ".OBJ", vbTextCompare) strPath = Mid(strCmd, 2, intPos + 2) intPos = InStrRev(strPath, " \") strPath = Left(strPath, intPos - 1) ' Open folder Set fld = oFS.GetFolder(strPath) ' Get files in folder For Each fil In fld.Files If UCase(oFS.GetExtensionName(fil)) = "DEF" Then strDefFile = fil SpecialLink = True End If If UCase(oFS.GetExtensionName(fil)) = "RES" The n strResFile = fil fResource = True End If If SpecialLink And fResource Then Exit For Next ' Change command line arguments if flag set If SpecialLink Then ' Determine contents of .DEF file Set tsDef = oFS.OpenTextFile(strDefFile) strFileContents = tsDef.ReadAll
If InStr(1, strFileContents, "CplApplet", vbTextCompare) > 0 Then fCPL = True End If ' Add module definition before /DLL switch intPos = InStr(1, strCmd, "/DLL", vbTextCompare) If intPos > 0 Then strCmd = Left(strCmd, intPos - 1) & _ " /DEF:" & Chr(34) & strDefFile & Chr(34) & " " & _ Mid(strCmd, intPos) End If ' Include .RES file if one exist s If fResource Then intPos = InStr(1, strCmd, "/ENTRY", vbTextCompare) strCmd = Left(strCmd, intPos - 1) & Chr(34) & strResFile & _ Chr(34) & " " & Mid(strCmd, intPos) End If ' If Control Panel applet, change "DLL" extension to "CPL" If fCPL Then strCmd = Replace(strCmd, ".dll", ".cpl", 1, , vbTextCompare) End If ' Write linker options to output file ts.WriteLine "Command line arguments after ts.WriteBlankLines 1 ts.WriteLine " " & strCmd ts.WriteBlankLines 2 End If
modification:"
ts.WriteLine "Calling LINK.EXE linker" Shell "linklnk.exe " & strCmd If Err.Number <> 0 Then ts.WriteLine "Error in calling linker..." Err.Clear End If ts.WriteBlankLines 1 ts.WriteLine "Returned from linker call" ts.Close End Sub
Este vinculador proxy modifica sólo los argumentos de línea de comandos se pasa al vinculador si un archivo de definición está en el directorio que contiene el proyecto de Visual Basic;. de lo contrario, simplemente pasa los argumentos de línea de comandos en el enlaza dor sin cambios. Si un archivo de definición. está presente, se agrega un modificador / DE F para la línea de comandos. También se determina si los archivos de recursos se van a a gregar a la lista de archivos vinculados. Por último, examina la tabla de exportación para determinar si una función llamada CP lApplet está presente, si es así, cambia la extensión del archivo de salida es de dll para cpl... 4. Para instalar el enlazador proxy, cambiar el nombre original de Visual Basic vinculador LinkLnk.exe, copie el enlazador proxy en el directorio de Visual Basic, y el nombre de Link.exe. Una vez que creemos nuestro enlazador proxy, que puede volver a car gar nuestro proyecto MathLib y compilarlo en un archivo DLL seleccionando la opción Hacer MathLib.exe en el menú Archivo.
Prueba de la DLL Una
vez que creemos nuestro DLL de Windows, el paso final es poner a prueba para asegurarse de
que funciona. Par a ello, cree un nuevo proyecto EXE est ándar (llamémosla MathLibTest) y añadir un
módulo de código. Para asegurarse de que el código en nuestro proyecto se puede acceder a las funciones exportadas por la DLL, se utiliza el estándar de Visual Basic instrucción Declare. Declaramos nuestros tres exportados rutinas matemáticas en el módulo de código de la siguiente manera:
Option Explicit Public Declare Function Increment Lib "C: \VBProjects\MathLib\mathlib.dll" ( _ value As Integer) As Integer Public Declare Function Decrement Lib "C: \VBProjects\MathLib\mathlib.dll" ( _ value As Integer) As Integer Public Declare Function Square Lib "C: \VBProjects\MathLib\mathlib.dll" ( _ value As Long) As Long
A continuación, puede utilizar el código siguiente en el módulo de formulario para llamar a las rutinas en el archivo DLL:
Option Explicit Private Sub cmdDecrement_Click() txtDecrement.Text = Decrement(CInt(txtDecrement.Text)) End Sub Private Sub cmdIncrement_Click() txtIncrement.Text = Increment(CInt( txtIncrement.Text)) End Sub Private Sub cmdSquare_Click() txtSquare.Text = Square(CLng(txtSquare.Text)) End Sub Private Sub Form_Load() txtIncrement.Text = 0 txtDecrement.Text = 100 txtSquare.Text = 2 End Sub
Cuando llamamos a cada una de las funciones
MathLib,
la ventana de la aplicación puede aparecer
como lo hace en la figura 2, lo que confirma que las llamadas a las rutinas MathLib funciona como se esperaba.