Vamos a ver con un ejemplo pr?ctico como crear una Librer?a de Enlace Din?mico (DLL) con Visual C++ para luego utilizarla desde una aplicación Visual Basic.
Nuestra DLL contendr? dos funciones: La primera la llamaremos Suma y, obviamente, sumar? dos valores enteros que pondremos a su disposición. La segunda recibir? una cadena de caracteres y simplemente reemplazar? cada caracter de la cadena por una X, por lo que la denominaremos LlenaDeX.
A pesar de la simpleza de este ejemplo, lo importante aqui es concentrarnos en el procedimiento de creación de la librer?a y su utilización desde el entorno de Visual Basic.
1. En Visual C++, creamos un Nuevo Project Workspace.
En el cuadro de di?logo seleccionamos Type: MFC App Wizard (dll) y en el campo Name: ponemos Demo.
Al hacer click en el bot?n Create... el asistente nos mostrar? un nuevo cuadro de di?logo donde debemos seleccionar la opción Regular DLL with MFC statically linked y pulsar el bot?n Finish para terminar.
Luego de unos instantes encontraremos que han sido creados varios archivos.
2. Ubicamos el archivo principal del proyecto, llamado Demo.cpp y luego de las instrucciones dirigidas al preprocesador (que comienzan con #) incorporamos el c?digo que corresponde a cada procedimiento:
Archivo Demo.cpp
extern "C"
int WINAPI Suma(int dato1, int dato2)
{
int temp;
temp=dato1+dato2;
return (temp);
};
void WINAPI LlenaDeX(char* cadena, int largo)
{
char *puntero;
puntero=cadena;
for (int n=1;n=largo;n++)
{
*puntero='X';
puntero++;
};
};
3. El pr?ximo paso es agregar cada uno de estos procedimientos a la sección export del archivo Demo.def, para que puedan ser accedidas desde programas externos. Simplemente, para cada función en la DLL, Añadimos una l?nea conteniendo el nombre exacto de la misma. En nuestro caso el archivo quedar?a como sigue:
Archivo Demo.def
LIBRARY "DEMO"
DESCRIPTION 'DEMO Windows Dynamic Link Library'
EXPORTS
Suma
LlenaDeX
4. Luego necesitamos proveer los prototipos de las funciones en el archivo de cabecera Demo.h.
Los prototipos son exactamente iguales a las definiciones que agregamos a Demo.cpp pero sin los nombres de variables.
El c?digo que sigue lo agregamos al final del archivo Demo.h creado por el asistente:
Archivo Demo.h
#ifdef __cplusplus
extern "C" {
#endif
int WINAPI Suma(int, int);
void WINAPI LlenaDeX(char*, int);
#ifdef __cplusplus
}
#endif
5. Por último, salvamos todos los archivos y nos dirigimos al men? Build y seleccionamos Build Demo.dll para compilar un archivo de prueba que se crear? en un subdirectorio \debug dentro del directorio principal del proyecto.
6. Cargamos el entorno de VB y creamos un nuevo proyecto Standard Exe denomin?ndolo Demo.vbp
7. Agregamos un m?dulo e incorporamos las declaraciones correspondientes:
Archivo Demo.bas
Declare Function Suma Lib "c:\demo\debug\Demo.dll" (ByVal Numero1 As Long, ByVal Numero2 As Long)
Declare Sub LlenaDeX Lib "c:\demo\debug\Demo.dll" (ByVal Cadena As String, ByVal Longitud As Long)
Observemos que la función Suma devuelve un valor, por lo tanto la declaramos como Function mientras que LlenaDeX no retorna nada por lo cual la definimos como Sub.
Tambien es importante hacer la correcta conversi?n de tipos para evitar errores que normalmente producen el colapso del sistema entero.
8. Agregamos un formulario desde donde utilizamos las funciones llam?ndolas mediante dos botones, por ejemplo:
Archivo Demo.frm
Private Sub CommandSuma_Click()
Print Suma(2,3)
End Sub
Private Sub CommandLlenaDeX_Click()
Dim Cad As String
Cad = Space(30)
LlenaDeX Cad, 30
Print Cad
End Sub
Un detalle MUY IMPORTANTE: Cuando pasamos cadenas de caracteres a procedimientos escritos en C, no podemos pasar cadenas vac?as o variables que no hayan sido inicializadas. Puesto que C recibe un puntero a una dirección de memoria que debe contener algo (en nuestro caso, inicializamos la variable con 30 espacios).
9. ?FIN! Nuestro proyecto está terminado. Solo resta compilar el proyecto en C++ con la opción WIN32 Release, que crear? la versi?n definitiva de nuestra librer?a en el subdirectorio \release.
En Visual basic, debemos tener cuidado con la referencia a la ubicación del archivo DLL en el par?metro Lib de la sentencia Declare. Para evitar inconvenientes lo más sencillo es ubicar nuestra librer?a en el mismo directorio que la aplicación Visual Basic, o bien en el directorio \windows.