Creación de archivos DLL de C/C++ en Visual StudioCreate C/C++ DLLs in Visual Studio

En Windows, una biblioteca de vínculos dinámicos (DLL) es un tipo de archivo ejecutable que actúa como una biblioteca compartida de funciones y recursos.In Windows, a dynamic-link library (DLL) is a kind of executable file that acts as a shared library of functions and resources. La vinculación dinámica es una funcionalidad del sistema operativoDynamic linking is an operating system capability. que permite a un archivo ejecutable llamar a funciones o usar recursos almacenados en un archivo independiente.It enables an executable to call functions or use resources stored in a separate file. Estas funciones y recursos se pueden compilar e implementar de forma independiente con respecto a los archivos ejecutables que los usan.These functions and resources can be compiled and deployed separately from the executables that use them.

Un archivo DLL no es un archivo ejecutable independiente.A DLL isn't a stand-alone executable. Los archivos DLL se ejecutan en el contexto de las aplicaciones que los llaman.DLLs run in the context of the applications that call them. El sistema operativo carga el archivo DLL en el espacio de memoria de la aplicación.The operating system loads the DLL into an application's memory space. Este proceso se lleva a cabo cuando se carga la aplicación (vinculación implícita) o a petición en tiempo de ejecución (vinculación explícita).It's done either when the application is loaded (implicit linking), or on demand at runtime (explicit linking). Los archivos DLL también hacen que sea más fácil compartir funciones y recursos en archivos ejecutables.DLLs also make it easy to share functions and resources across executables. Distintas aplicaciones pueden acceder al mismo tiempo al contenido de una única copia de un archivo DLL en la memoria.Multiple applications can access the contents of a single copy of a DLL in memory at the same time.

Diferencias entre la vinculación dinámica y la vinculación estáticaDifferences between dynamic linking and static linking

La vinculación estática copia todo el código objeto de una biblioteca estática en los archivos ejecutables que lo usan cuando se compilan.Static linking copies all the object code in a static library into the executables that use it when they're built. La vinculación dinámica solo incluye la información que Windows necesita en tiempo de ejecución para encontrar y cargar el archivo DLL que contiene una función o un elemento de datos.Dynamic linking includes only the information needed by Windows at run time to locate and load the DLL that contains a data item or function. Cuando crea un archivo DLL, también crea una biblioteca de importación que contiene esta información.When you create a DLL, you also create an import library that contains this information. Cuando compila un archivo ejecutable que llama al archivo DLL, el enlazador usa los símbolos exportados en la biblioteca de importación para almacenar esta información para el cargador de Windows.When you build an executable that calls the DLL, the linker uses the exported symbols in the import library to store this information for the Windows loader. Cuando el cargador carga un archivo DLL, este se asigna en el espacio de memoria de la aplicación.When the loader loads a DLL, the DLL is mapped into the memory space of your application. Si está presente, se llama a una función especial en el archivo DLL, DllMain, para que realice cualquier inicialización que requiera el archivo DLL.If present, a special function in the DLL, DllMain, is called to do any initialization the DLL requires.

Diferencias entre aplicaciones y archivos DLLDifferences between applications and DLLs

Aunque tanto los archivos DLL como las aplicaciones son módulos ejecutables, se diferencian en varios aspectos.Even though DLLs and applications are both executable modules, they differ in several ways. La diferencia más obvia es que no se puede ejecutar un archivo DLL.The most obvious difference is that you can't run a DLL. Desde el punto de vista del sistema, hay dos diferencias fundamentales entre las aplicaciones y los archivos DLL:From the system's point of view, there are two fundamental differences between applications and DLLs:

  • Una aplicación puede tener varias instancias ejecutándose simultáneamente en el sistema.An application can have multiple instances of itself running in the system simultaneously. En cambio, solo se puede tener una instancia de un archivo DLL.A DLL can have only one instance.

  • Una aplicación se puede cargar como un proceso.An application can be loaded as a process. Puede ser propietaria de elementos como una pila, subprocesos de ejecución, una memoria global, identificadores de archivo y una cola de mensajes.It can own things such as a stack, threads of execution, global memory, file handles, and a message queue. Un archivo DLL no puede poseer estos elementos.A DLL can't own these things.

Ventajas de usar archivos DLLAdvantages of using DLLs

La vinculación dinámica a código y recursos ofrece varias ventajas con respecto a la vinculación estática:Dynamic linking to code and resources offers several advantages over static linking:

  • La vinculación dinámica ahorra memoria y reduce el intercambio.Dynamic linking saves memory and reduces swapping. Muchos procesos pueden usar simultáneamente un archivo DLL, al compartir una sola copia de los elementos de solo lectura del archivo DLL en la memoria.Many processes can use a DLL simultaneously, sharing a single copy of the read-only parts of a DLL in memory. En cambio, todas las aplicaciones compiladas mediante una biblioteca vinculada estáticamente tienen una copia completa del código de la biblioteca que Windows debe cargar en la memoria.In contrast, every application that is built by using a statically linked library has a complete copy of the library code that Windows must load into memory.

  • La vinculación dinámica ahorra espacio en disco y ancho de banda.Dynamic linking saves disk space and bandwidth. Varias aplicaciones pueden compartir una única copia del archivo DLL en disco.Many applications can share a single copy of the DLL on disk. En cambio, las aplicaciones compiladas con una biblioteca de vínculos estáticos tienen el código de biblioteca vinculado en la imagen ejecutable.In contrast, each application built by using a static link library has the library code linked into its executable image. Esto usa más espacio en disco y ocupa más ancho de banda al transferirse.That uses more disk space, and takes more bandwidth to transfer.

  • El mantenimiento, las revisiones de seguridad y las actualizaciones pueden ser más fáciles.Maintenance, security fixes, and upgrades can be easier. Cuando las aplicaciones usan funciones comunes en un archivo DLL, se pueden implementar correcciones de errores e actualizaciones en el archivo DLL.When your applications use common functions in a DLL, you can implement bug fixes and deploy updates to the DLL. Cuando se actualizan los archivos DLL, no es necesario volver a compilar a vincular las aplicaciones que los emplean.When DLLs are updated, the applications that use them don't need to be recompiled or relinked. Pueden usar el nuevo archivo DLL en cuanto se implementa.They can make use of the new DLL as soon as it's deployed. Por el contrario, cuando se realizan correcciones en código objeto vinculado estáticamente, es necesario volver a vincular y a implementar cada aplicación que lo use.In contrast, when you make fixes in statically linked object code, you must relink and redeploy every application that uses it.

  • Puede usar archivos DLL para ofrecer soporte técnico posventa.You can use DLLs to provide after-market support. Por ejemplo, se puede modificar un archivo DLL de un controlador de vídeo de forma que permita una presentación que no estaba disponible en la versión comercial.For example, a display driver DLL can be modified to support a display that wasn't available when the application was shipped.

  • Puede usar la vinculación explícita para detectar y cargar archivos DLL en tiempo de ejecución.You can use explicit linking to discover and load DLLs at runtime. Por ejemplo, las extensiones de aplicación que agregan nuevas funcionalidades a la aplicación sin volver a compilarla o a implementarla.For example, application extensions that add new functionality to your app without rebuilding or redeploying it.

  • La vinculación dinámica facilita la compatibilidad con aplicaciones escritas en lenguajes de programación diferentes.Dynamic linking makes it easier to support applications written in different programming languages. Programas creados con distintos lenguajes de programación pueden llamar a la misma función DLL siempre que sigan la convención de llamada a la función.Programs written in different programming languages can call the same DLL function as long as the programs follow the function's calling convention. Los programas y la función DLL deben ser compatibles en los siguientes aspectos: el orden en el que la función espera que los argumentos se inserten en la pila;The programs and the DLL function must be compatible in the following ways: The order in which the function expects its arguments to be pushed onto the stack. el hecho de que sea la función o la aplicación la responsable de limpiar la pila;Whether the function or the application is responsible for cleaning up the stack. y el hecho de que los argumentos se pasen en registros.And, whether any arguments are passed in registers.

  • La vinculación dinámica proporciona un mecanismo para ampliar las clases de la biblioteca MFC (Microsoft Foundation Class).Dynamic linking provides a mechanism to extend the Microsoft Foundation Class library (MFC) classes. Puede derivar clases a partir de las clases MFC existentes y colocarlas en un archivo DLL de extensión de MFC para que las utilicen las aplicaciones MFC.You can derive classes from the existing MFC classes and place them in an MFC extension DLL for use by MFC applications.

  • La vinculación dinámica facilita la creación de versiones internacionales de la aplicación.Dynamic linking makes creation of international versions of your application easier. Los archivos DLL son una manera práctica de proporcionar recursos específicos de la configuración regional, lo que facilita enormemente la creación de versiones internacionales de una aplicación.DLLs are a convenient way to supply locale-specific resources, which make it much easier to create international versions of an application. En lugar de enviar muchas versiones localizadas de la aplicación, puede colocar las cadenas y las imágenes de cada idioma en un archivo DLL de recursos independiente.Instead of shipping many localized versions of your application, you can place the strings and images for each language in a separate resource DLL. Después, la aplicación puede cargar los recursos adecuados para esa configuración regional en tiempo de ejecución.Then your application can load the appropriate resources for that locale at runtime.

Una posible desventaja del uso de archivos DLL es que la aplicación no es autónoma.A potential disadvantage to using DLLs is that the application isn't self-contained. Depende de la existencia de un módulo DLL independiente, que debe implementar o comprobar usted mismo como parte de la instalación.It depends on the existence of a separate DLL module: one that you must deploy or verify yourself as part of your installation.

Más información sobre la creación y el uso de archivos DLLMore information on how to create and use DLLs

En los artículos siguientes se proporciona información detallada sobre cómo crear archivos DLL de C/C++ en Visual Studio.The following articles provide detailed information about how to create C/C++ DLLs in Visual Studio.

Tutorial: Creación y uso de una biblioteca de vínculos dinámicos (C++)Walkthrough: Creating and using a dynamic link library (C++)
Describe cómo crear y usar una DLL con Visual Studio.Describes how to create and use a DLL using Visual Studio.

Tipos de archivos DLLKinds of DLLs
Proporciona información sobre las distintas clases de archivos DLL que se pueden compilar.Provides information about the different kinds of DLLs that can be built.

Preguntas más frecuentes sobre archivos DLLDLL frequently asked questions
Proporciona respuestas a las preguntas más frecuentes sobre los archivos DLL.Provides answers to frequently asked questions about DLLs.

Vincular un ejecutable a un archivo DLLLink an executable to a DLL
Describe el vínculo a un archivo DLL explícito e implícito.Describes explicit and implicit linking to a DLL.

Inicializar un archivo DLLInitialize a DLL
Describe el código de inicialización del archivo DLL que se debe ejecutar cuando este se carga.Discusses DLL initialization code that must execute when your DLL loads.

Archivos DLL y comportamiento de la biblioteca en tiempo de ejecución de Visual C++DLLs and Visual C++ run-time library behavior
Describe la secuencia de inicio del archivo DLL de la biblioteca en tiempo de ejecución.Describes the run-time library DLL startup sequence.

LoadLibrary y AfxLoadLibraryLoadLibrary and AfxLoadLibrary
Describe el uso de LoadLibrary y AfxLoadLibrary para vincular explícitamente a un archivo DLL en tiempo de ejecución.Discusses using LoadLibrary and AfxLoadLibrary to explicitly link to a DLL at runtime.

GetProcAddressGetProcAddress
Explica el uso de GetProcAddress para obtener la dirección de una función exportada en el archivo DLL.Discusses using GetProcAddress to obtain the address of an exported function in the DLL.

FreeLibrary y AfxFreeLibraryFreeLibrary and AfxFreeLibrary
Describe el uso de FreeLibrary y AfxFreeLibrary cuando el módulo del archivo DLL ya no se necesita.Discusses using FreeLibrary and AfxFreeLibrary when the DLL module is no longer needed.

Orden de búsqueda de la biblioteca de vínculos dinámicosDynamic-Link Library Search Order
Describe la ruta de acceso de búsqueda que usa el sistema operativo Windows para encontrar un archivo DLL en el sistema.Describes the search path that the Windows operating system uses to locate a DLL on the system.

Estados de módulos de un archivo DLL de MFC estándar vinculado dinámicamente a MFCModule states of a regular MFC DLL dynamically linked to MFC
Describe los estados de módulos de un archivo DLL de MFC estándar vinculado dinámicamente a MFC.Describes the module states of a regular MFC DLL dynamically linked to MFC.

Archivos DLL de extensión MFCMFC extension DLLs
Describe los archivos DLL que suelen implementar clases reutilizables derivadas de las clases existentes de MFC.Explains DLLs that typically implement reusable classes derived from the existing MFC classes.

Crear un archivo DLL de recursosCreating a resource-only DLL
Describe un archivo DLL sólo de recursos, que únicamente contiene recursos, como iconos, mapas de bits, cadenas y cuadros de diálogo.Discusses a resource-only DLL, which contains nothing but resources, such as icons, bitmaps, strings, and dialog boxes.

Recursos localizados en aplicaciones MFC: archivos DLL satéliteLocalized resources in MFC Applications: Satellite DLLs
Proporciona compatibilidad mejorada con archivos DLL satélite, una característica que le ayuda a crear aplicaciones en múltiples idiomas.Provides enhanced support for satellite DLLs, a feature that helps in creating applications localized for multiple languages.

Importar y exportarImporting and exporting
Describe símbolos públicos de importación a una aplicación o funciones de exportación de un archivo DLL.Describes importing public symbols into an application or exporting functions from a DLL

Tecnología activa y archivos DLLActive technology and DLLs
Permite a los servidores de objetos implementarse dentro de un archivo DLL.Allows object servers to be implemented inside a DLL.

Automation en un archivo DLLAutomation in a DLL
Describe qué proporciona la opción Automation en el Asistente para archivos DLL de MFC.Describes what the Automation option in the MFC DLL Wizard supplies.

Convenciones de nomenclatura para archivos DLL de MFCNaming conventions for MFC DLLs
Explica cómo los archivos DLL y las bibliotecas incluidos en MFC utilizan una convención de nomenclatura estructurada.Discusses how the DLLs and libraries included in MFC follow a structured naming convention.

Llamar a funciones de un archivo DLL desde aplicaciones programadas en Visual BasicCalling DLL functions from Visual Basic applications
Describe cómo llamar a funciones DLL desde aplicaciones de Visual Basic.Describes how to call DLL functions from Visual Basic applications.

Uso de MFC como parte de un archivo DLLUsing MFC as part of a DLL
Describe los archivos DLL de MFC estándar, que permiten usar la biblioteca MFC como parte de una biblioteca de vínculos dinámicos de Windows.Describes regular MFC DLLs, which let you use the MFC library as part of a Windows dynamic-link library.

Versión de DLL de MFCDLL version of MFC
Describe la forma de usar las bibliotecas de vínculos dinámicos compartidas MFCxx.dll y MFCxxD.dll (donde x es el número de versión de MFC) con aplicaciones MFC y archivos DLL de extensión de MFC.Describes how you can use the MFCxx.dll and MFCxxD.dll (where x is the MFC version number) shared dynamic-link libraries with MFC applications and MFC extension DLLs.