Programación III - Visual C ++

by M@lonso © 2002

Creando una DLL con C++

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 aquí 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.


Regresar
M@lonso (c) 2002