Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Tutorial: Crear y utilizar una biblioteca de vínculos dinámicos (C++)

Este tutorial paso a paso muestra cómo crear una biblioteca de vínculos dinámicos (DLL) para el uso con aplicaciones de C++. Utilizar una biblioteca es una gran manera de reutilizar el código. En lugar de volver a implementar las mismas rutinas en todos los programas que cree, escríbalas una vez y, a continuación, haga referencia a ellas desde las aplicaciones que requieren la funcionalidad. Al colocar código en un archivo DLL, se guarda el espacio en cada aplicación que haga referencia a él y se puede actualizar el archivo DLL sin volver a compilar todas las aplicaciones. Para obtener más información sobre DLLs, vea Archivos DLL en Visual C++.

En este tutorial se tratan las siguientes tareas:

  • Crear un proyecto DLL.

  • Agregar una clase a la DLL.

  • Crear una aplicación de consola que utiliza vinculación dinámica en tiempo de carga para hacer referencia al archivo DLL.

  • Usar la funcionalidad de la biblioteca de clases en la aplicación.

  • Ejecute la aplicación.

En este tutorial crea un archivo DLL que se puede llamar desde las aplicaciones que utilizan las convenciones de llamada de C++. Para obtener información sobre cómo crear archivos DLL para su uso con otros lenguajes, vea Llamar a funciones de un archivo DLL desde aplicaciones programadas en Visual Basic.

En este tema, se da por supuesto que conoce los fundamentos del lenguaje C++.

Para crear un proyecto de biblioteca de vínculos dinámicos (DLL)

  1. En la barra de menús, elija Archivo, Nuevo, Proyecto.

  2. En el panel de la izquierda del cuadro de diálogo Nuevo proyecto, expanda Instalado, Plantillas, Visual C++ y, a continuación, seleccione Win32.

  3. En el panel central, seleccione Aplicación de consola Win32.

  4. Especifique un nombre para el proyecto; por ejemplo, MathFuncsDll, en el cuadro Nombre. Especifique un nombre para solución, por ejemplo, DynamicLibrary, en el cuadro de Nombre de la solución. Elija el botón Aceptar.

  5. En la página Información general del cuadro de diálogo Asistente para aplicaciones Win32, elija el botón Siguiente.

  6. En la página Configuración de la aplicación, en Tipo de aplicación, seleccione DLL.

  7. Elija el botón Finalizar para crear el proyecto.

Para agregar una clase a la biblioteca de vínculos dinámicos

  1. Para crear un archivo de encabezado para una nueva clase, en la barra de menús elija ProyectoAgregar nuevo elemento. En el cuadro de diálogo Agregar nuevo elemento, en el panel izquierdo, bajo Visual C++, seleccione Código. En el panel central, seleccione Archivo de encabezado (.h). Especifique un nombre para el archivo de encabezado, por ejemplo, MathFuncsDll.h y después elija el botón de Agregar. Se muestra un archivo de encabezado en blanco.

  2. Agregue el código siguiente al principio del archivo de encabezado:

    
    // MathFuncsDll.h
    
    #ifdef MATHFUNCSDLL_EXPORTS
    #define MATHFUNCSDLL_API __declspec(dllexport) 
    #else
    #define MATHFUNCSDLL_API __declspec(dllimport) 
    #endif
    
    
    
    
  3. Agregue una clase básica denominada MyMathFuncs para hacer operaciones matemáticas comunes, como suma, resta, multiplicación y división. El código debe ser similar a este:

    
    namespace MathFuncs
    {
        // This class is exported from the MathFuncsDll.dll
        class MyMathFuncs
        {
        public: 
            // Returns a + b
            static MATHFUNCSDLL_API double Add(double a, double b); 
    
            // Returns a - b
            static MATHFUNCSDLL_API double Subtract(double a, double b); 
    
            // Returns a * b
            static MATHFUNCSDLL_API double Multiply(double a, double b); 
    
            // Returns a / b
            // Throws const std::invalid_argument& if b is 0
            static MATHFUNCSDLL_API double Divide(double a, double b); 
        };
    }
    
    
    

    Cuando se define el símbolo MATHFUNCSDLL_EXPORTS, el símbolo MATHFUNCSDLL_API establecerá el modificador __declspec(dllexport) en las declaraciones de función miembro de este código. Este modificador permite que el archivo DLL exporte la función para que pueda ser utilizada por otras aplicaciones. Cuando se define MATHFUNCSDLL_EXPORTS, MATHFUNCSDLL_API define el modificador __declspec(dllimport) en las declaraciones de función miembro. Este modificador permite al compilador optimizar la importación de la función de la DLL para utilizarlo en otras aplicaciones. De forma predeterminada, se define MATHFUNCSDLL_EXPORTS cuando se compila el proyecto de MathFuncsDll. Para obtener más información, vea dllexport, dllimport.

    Nota Nota

    Si está compilando el proyecto DLL en la línea de comandos, utilice la opción del compilador /D para definir el símbolo de MATHFUNCSDLL_EXPORTS.

  4. En el proyecto MathFuncsDll, en el Explorador de soluciones, en la carpeta Archivos de código fuente, abra MathFuncsDll.cpp.

  5. Implemente la funcionalidad para MyMathFuncs en el archivo de código fuente. El código debe ser similar a este:

    
    // MathFuncsDll.cpp : Defines the exported functions for the DLL application.
    //
    
    #include "stdafx.h"
    #include "MathFuncsDll.h"
    #include <stdexcept>
    
    using namespace std;
    
    namespace MathFuncs
    {
        double MyMathFuncs::Add(double a, double b)
        {
            return a + b;
        }
    
        double MyMathFuncs::Subtract(double a, double b)
        {
            return a - b;
        }
    
        double MyMathFuncs::Multiply(double a, double b)
        {
            return a * b;
        }
    
        double MyMathFuncs::Divide(double a, double b)
        {
            if (b == 0)
            {
                throw invalid_argument("b cannot be zero!");
            }
    
            return a / b;
        }
    }
    
    
    
  6. Compile la biblioteca de vínculos dinámicos eligiendo Compilación, Compilar solución en la barra de menús.

    Nota Nota

    Si la edición express que no muestra un menú de Compilación, en la barra de menú, elija Herramientas, Configuración, Configuración para expertos para habilitarla y elija Compilación, Compilar solución.

    Nota Nota

    Si está generando un proyecto en la línea de comandos, utilice la opción del compilador /LD para especificar que el archivo de salida va a ser un archivo DLL. Para obtener más información, vea /MD, /MT, /LD (Utilizar la biblioteca en tiempo de ejecución). Utilice la opción de compilador /EHsc para habilitar el control de excepciones de C++. Para obtener más información, vea /EH (Modelo de control de excepciones).

Para crear una aplicación que haga referencia DLL

  1. Para crear la aplicación de C++ que hará referencia y utilizará la DLL que acaba de crear, en la barra de menú, elija Archivo, Nuevo, Proyecto.

  2. En el panel izquierdo, debajo de Visual C++, seleccione Win32.

  3. En el panel central, seleccione Aplicación de consola Win32.

  4. Especifique un nombre para el proyecto; por ejemplo, MyExecRefsDll, en el cuadro Nombre. Junto a Solución, seleccione Agregar a solución en la lista desplegable. Esto agrega el nuevo proyecto a la misma solución que contiene el archivo DLL. Elija el botón Aceptar.

  5. En la página Información general del cuadro de diálogo Asistente para aplicaciones Win32, elija el botón Siguiente.

  6. En la página Configuración de la aplicación, en Tipo de aplicación, seleccione Aplicación de consola.

  7. En la página Configuración de la aplicación, en Opciones adicionales, desactive la casilla Encabezado precompilado.

  8. Elija el botón Finalizar para crear el proyecto.

Para utilizar la funcionalidad de la biblioteca de clases en la aplicación

  1. Después de crear una aplicación de consola, se crea un programa vacío. El nombre del archivo de código fuente será el mismo que el elegido anteriormente. En este ejemplo, se llama MyExecRefsDll.cpp.

  2. Para utilizar en la aplicación las rutinas matemáticas que creó en la DLL, debe hacer referencia a ella. Para ello, seleccione el proyecto MyExecRefsDll en el Explorador de soluciones y, a continuación, en la barra de menús, elija Proyecto, Referencias. En el cuadro de diálogo Páginas de propiedades, expanda el nodo Propiedades comunes, seleccione Marco de trabajo y referencias y, a continuación, elija el botón Agregar nueva referencia. Para obtener más información sobre el cuadro de diálogo Referencias, vea Marco de trabajo y referencias, Propiedades comunes, Páginas de propiedades de <nombreDeProyecto> (Cuadro de diálogo).

  3. El cuadro de diálogo Agregar referencia muestra las bibliotecas a las que puede hacer referencia. La pestaña Proyecto enumera los proyectos de la solución actual y las bibliotecas que contienen. En la pestaña de Proyectos, active la casilla situada junto a MathFuncsDll y después elija el botón de Aceptar.

  4. Para hacer referencia a los archivos de encabezado de la DLL, debe modificar la ruta de acceso de los directorios incluidos. Para ello, en el cuadro de diálogo Páginas de propiedades, expanda el nodo Propiedades de configuración, a continuación el nodo C/C++ y seleccione General. Junto a Directorios de inclusión adicionales, especifique la ruta de acceso a la ubicación del archivo de encabezado MathFuncsDll.h. Puede utilizar una ruta de acceso relativa, como ..\MathFuncsDll\, y luego elegir el botón Aceptar.

  5. Ahora puede utilizar la clase MyMathFuncs en esta aplicación. Reemplace el contenido de MyExecRefsDll.cpp por el código siguiente:

    
    // MyExecRefsDll.cpp
    // compile with: /EHsc /link MathFuncsDll.lib
    
    #include <iostream>
    
    #include "MathFuncsDll.h"
    
    using namespace std;
    
    int main()
    {
        double a = 7.4;
        int b = 99;
    
        cout << "a + b = " <<
            MathFuncs::MyMathFuncs::Add(a, b) << endl;
        cout << "a - b = " <<
            MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
        cout << "a * b = " <<
            MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
        cout << "a / b = " <<
            MathFuncs::MyMathFuncs::Divide(a, b) << endl;
    
        try
        {
            cout << "a / 0 = " <<
                MathFuncs::MyMathFuncs::Divide(a, 0) << endl; 
        }
        catch (const invalid_argument &e) 
        {
            cout << "Caught exception: " << e.what() << endl; 
        }
    
        return 0;
    }
    
    
    
  6. Compile el archivo ejecutable; para ello, elija Compilación, Compilar solución en la barra de menús.

Para ejecutar la aplicación

  1. Asegúrese de que MyExecRefsDll está seleccionado como proyecto predeterminado. En el Explorador de soluciones, seleccione MyExecRefsDll y, a continuación, en la barra de menús, elija Proyecto, Establecer como proyecto de inicio.

  2. Para ejecutar el proyecto, en la barra de menús, elija Depurar, Iniciar sin depurar. El resultado debería ser similar a lo siguiente:

                  
                    a + b = 106,4
    a - b = -91,6
    a * b = 732,6
    a / b = 0,0747475
    Excepción detectada: b no puede ser cero.
    
                  
                

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft