Sei sulla pagina 1di 13

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Programando por diversion HOME Lenguaje Linux Otros Web Windows Acerca de Archivos Contctanos Software SUSCRBETE VA RSS Home :: Windows :: Artculos :: Creando y consumiendo DLLs con C++ Categorias Artculos Consola Entorno Visual Hardware Trucos

Creando y consumiendo DLLs con C++


mar 16, 2010 en Artculos por Si quieres comenzar a hacer aplicaciones de gran escala y necesitas separar la lgica de tu programa de tu capa de presentacin necesitas aprender a utilizar DLLs. Una DLL te permite crear un archivo con cdigo ejecutable que puede ser consumido en muchas aplicaciones y diversos lenguajes.

Curso Java Web Developer


Obten la Certificacion Java EE6 Web Developer. Inicios: Lima y Online
www.bsgrupo.com

1 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

En este artculo te voy a explicar que es una DLL, por qu debes utilizarlas y como se utilizan. Si quieres desarrollar buen software que sea fcil de mantener tienes que aprender a utilizar DLLs.

Qu es una DLL?
Una DLL o Dynamic-Link Library es un archivo con cdigo ejecutable que puede ser cargado cuando se necesite y que puede ser reutilizado en muchas aplicaciones. Por lo general, cuando creas aplicaciones simples, todo el cdigo de tu programa lo colocas dentro del mismo ejecutable, esto es, dentro del formulario o dentro de clases dentro de tu proyecto. Si utilizas DLLs puedes separar pedazos de cdigo fuera de tu ejecutable para que puedan ser consumidos en varias aplicaciones y por varios lenguajes de programacin.

Por qu utilizar DLLs?


Para que quede un poco ms clara la importancia de utilizar DLLs te pongo un pequeo ejemplo. Supongamos que has hecho 5 programas dnde cada uno de ellos utiliza una funcin que permite ordenar un arreglo. Supongamos tambin que cada pedazo de este cdigo pesa 40Kb por lo que si uno de tus programas pesa 140Kb en realidad 40kb son del ordenamiento. (Esto no es posible de medir pero es para darte una idea). Ahora supongamos que un usuario utiliza tus 5 programas. Vamos a ver cmo se vera su estructura en disco.

Como puedes ver, cada programa tiene un peso diferente pero cada uno incluye 40KB del cdigo de ordenamiento por lo que en realidad nuestros programas tienen un total de 200KB (40*5) de cdigo de ordenamiento. Si no repitieramos el cdigo en cada uno de nuestros programas podramos reducir el tamao en 160KB (40 * 4). Aparentemente ahorrar 160KB de espacio parece insignificativo pero en verdad puede ser mucho ms que esto. Si en el ejemplo anterior separamos el cdigo de ordenamiento y lo colocamos en una DLL tendramos el siguiente esquema:

Como puedes ver, ahora tenemos un archivo ms que es nuestra DLL de ordenamiento (40KB) y ahora todos nuestros programas se han reducido en 40KB (En total 160KB). La gran ventaja es que ahora puedes crear muchos ms programas que utilicen el DLL de ordenamiento ahorrando 40KB por cada uno de ellos.
2 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

A pesar de que ahorrar espacio en disco es una gran ventaja, esta no es la mejor ventaja de utilizar DLLs. La mejor ventaja es MANTENIMIENTO. Supongamos que se descubre un nuevo mtodo de ordenamiento que es 50% ms eficiente y veloz que el que usaste en tu programa. Lo ideal sera actualizar tus programas para que utilicen el nuevo mtodo y por ende corran ms rpido. En el esquema 1 que no usa DLLs tendras que corregir tu mtodo de ordenamiento y recompilar los 5 programas. Luego tendras que volver a distribuir los programas a tus usuarios, es decir, tienes que mandarles 103,460KB para una pequea actualizacin. En cambio en el esquema 2 lo nico que tienes que hacer es recompilar tu DLL y mandarle 40KB a tus usuarios. Espero que te haya quedado clara la idea y la importancia de utilizar DLLs para desarrollar tus programas.

Cul es la diferencia con Class Library?


Cuando creas un Class Library de .NET, en el fondo ests creando una DLL y funciona de la misma forma a lo explicado hasta el momento. La nica diferencia es que una DLL de tipo Class Library solo puede ser consumida por aplicaciones hechas en .NET, mientras que una DLL pura (la que vamos a ver aqu) puede ser consumida por cualquier lenguaje de programacin. Otra gran diferencia, es que en C++ el Class Library solo acepta clases de tipo Managed por lo que no puedes utilizar C++ puro sino que tienes que adaptarte a la nomenclatura de .NET. La ltima gran diferencia que puedo encontrar es que con Class Library hacer una DLL es bastante ms sencillo que una DLL pura pero como acabo de mencionar tiene sus limitaciones.

Creando una DLL


En este caso te voy a mostrar como hacer DLLs con Visual Studio y Code Gear. Lo primero que tenemos que hacer es crear un proyecto de tipo DLL y se hace de la siguiente forma: Visual Studio Code Gear Selecciona del men la opcin File > New > Project. En la ventana que aparece selecciona Visual C++ / Win32 / Win32 Project. Ingresa el nombre del proyecto y la ruta donde lo quieres guardar (en este caso mi proyecto se llamar MiDLL y lo guardar en C:\Copstone) y presiona OK.

3 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

En la ventana que aparece simplemente presiona Siguiente. En la ventana que aparece a continuacin asegrate de seleccionar DLL y Empty Project, luego presiona Finalizar.

Esto debera haber creado un proyecto vaco. Ahora tenemos que agregarle un archivo que contendr el cdigo fuente de nuestra DLL.

4 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Selecciona del men la opcin Project > Add New Item. En la ventana que aparece selecciona Visual C++ / Code / C++ File (.cpp) e ingresa el nombre del archivo (en este caso main.cpp). Luego presiona Add.

La funcin DllMain
Ahora abre el archivo main.cpp y coloca el siguiente pedazo de cdigo:
1 2 3 4 5 6 7 #include <windows.h> //--------------------------------------------------------------------------BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //---------------------------------------------------------------------------

La funcin DllMain (la nica que existe hasta el momento) es el punto de partida y salida de mi DLL. Esta funcin cumple el rol de constructor y destructor a la misma vez. El primer parmetro hinstDLL es el handle del DLL, el segundo fwdreason es la razn por la cual se llam a este mtodo y el tercero lpvReserved recibe un valor si la librera se carg como esttica o NULL si se carg de forma dinmica. Existen cuatro razones (fwdreason) por las cuales se puede llamar a esta funcin pero para el caso de este artculo solo nos importan dos: DLL_PROCESS_ATTACH que es cuando se construye la DLL y DLL_PROCESS_DETACH que es cuando se destruye la DLL. Para mayor informacin puedes visitar DLLMain Callback Function.

Agregando mtodos a mi DLL


Voy a agregar dos funciones a mi DLL. En este caso no voy a explicar en detalle la implementacin de las
5 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

funciones porque de esto no se trata el artculo. Descripcin Recibe como parmetro el idioma y devuelve una cadena con el saludo en el idioma DameSaludo correspondiente. DameSuma Recibe como parmetro dos enteros y devuelve la suma de ellos. El cdigo completo es el siguiente:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 #include <windows.h> #include <string.h> //--------------------------------------------------------------------------BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) { return 1; } //--------------------------------------------------------------------------extern "C" __declspec(dllexport) char* DameSaludo(char *idioma) { if (strcmp(idioma, "en") == 0) return "Hello"; if (strcmp(idioma, "it") == 0) return "Ciao"; if (strcmp(idioma, "gr") == 0) return "Hallo"; if (strcmp(idioma, "fr") == 0) return "Bonjour"; return "Hola"; } //--------------------------------------------------------------------------extern "C" __declspec(dllexport) int DameSuma(int a, int b) { return a + b; }

Funcin

Como puedes notar, he agregado la librera string. Adems he declarado e implementado las dos funciones. Lo ms importante a notar en el cdigo es que he agregado la instruccin
extern "C" __declspec(dllexport)

justo antes de la declaracin de las funciones. Con esto estoy indicando que estas dos funciones sern publicas y pueden ser utilizadas por las aplicaciones que consuman la DLL. Listo! Nuestra DLL ya est creada. Lo nico que falta es compilarla as que dale clic derecho al proyecto y selecciona la opcin Build. Al compilar el proyecto se han generado una serie de archivos dentro de la carpeta Debug o Release del proyecto. El archivo MiDLL.dll es la DLL en s, esta contiene todo el cdigo compilado. El archivo MiDLL.lib es el archivo necesario para poder referenciar a la DLL, en pocas palabras es como el .h de la DLL.

Consumiendo una DLL


Para consumir una DLL vamos a crear un nuevo proyecto de entorno visual: Visual Studio Code Gear Selecciona del men la opcin File > New > Project. En la ventana que aparece selecciona Visual C++ / CLR / Windows Forms Application. Ingresa el nombre del proyecto y la ruta donde lo quieres guardar (en este caso mi proyecto se llamar UsarDLL y lo guardar
6 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

en C:\Copstone) y presiona OK. Adicionalmente, tienes que cambiar una propiedad del proyecto para que se compile en modo /clr y sea compatible con el uso de DLLs nativas de C++. Para lograr esto sigue las siguientes instrucciones: Selecciona del men la opcin Project > Properties. Luego selecciona Configuration Properties / General. Modifica la opcin Common Language Runtime Support por Common Language Runtime Support (/clr).

En tu formulario agrega un botn y dos labels. Al botn llmalo btnInvocar, al primer label lblSaludo y al otro lblSuma. Tu formulario debera verse as:

Importando la DLL
Lo que tenemos que hacer ahora es importar la DLL, para esto es necesario que junto a nuestro ejecutable esten los archivos MiDLL.dll y MiDLL.lib. La forma ms fcil de realizar esta tarea es copiar y pegar estos archivos a la carpeta de mi programa. Si has seguido las instrucciones al pie de la letra deberas encontrar los archivos en C:\Copstone\MiDLL\Debug y debes copiarlos a C:\Copstone\UsarDLL\Debug. Si esta ltima
7 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

carpeta no existe entonces compila tu proyecto para que se generen. Una vez que los archivos estn copiados en la carpeta correcta debes incluir el archivo lib colocando la siguiente lnea de cdigo en la parte dnde estn tus includes. Visual Studio Code Gear
1 #pragma comment(lib, "../Debug/MiDLL.lib")

Ten en cuenta que he colocado la ruta relativa a este archivo lib. Tambin hubiera podido colocar C:\Copstone\MiDLL\Debug\MiDLL.lib. Esta ruta es solamente para compilacin, no significa que tu DLL siempre tenga que estar en esta ruta una vez que tengas el ejecutable. Es ms, el archivo lib no tiene que estar presente cuando distribuyas tu programa y el archivo dll tiene que estar en la misma carpeta que tu ejecutable.

Importando las funciones de la DLL


Una vez que importamos la DLL necesitamos importar las funciones de la DLL de forma muy parecida a como las exportamos. Para importarlas agrega las siguientes lneas de cdigo antes de la declaracin de tu formulario.
1 2 extern "C" __declspec(dllimport) char* DameSaludo(char *idioma); extern "C" __declspec(dllimport) int DameSuma(int a, int b);

Ahora ya puedes utilizar las funciones DameSaludo y DameSuma como si las hubieras implementado dentro de este proyecto.

Programando el botn btnInvocar


El cdigo del botn btnSaludame debera ser el siguiente: Visual Studio Code Gear
1 2 lblSaludo->Text = gcnew String(DameSaludo("gr")); lblSuma->Text = DameSuma(10, 5).ToString();

Ahora prueba presionando el botn y cambiando el idioma de la funcin DameSaludo para que veas el mensaje en varios idiomas.

Publicando tu programa
Ahora ya puedes publicar tu programa con DLLs. Los nicos archivos que tienen que estar presentes cuando publiques tu programa son MiDLL.dll y UsarDLL.exe. Si quieres prueba copiando estos dos archivos a otra carpeta y corriendo la aplicacin. Tambin intenta eliminar el DLL y corriendo el programa otra vez para que veas que genera un error.

8 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Siguiente artculoConectndonos a SQL Server con ADO.NET parte II Artculos similares Crear una Aplicacin del tipo Consola en Visual C++ Creando un Proyecto Class Library Capturando imgenes con la cmara web Crear una Aplicacin del tipo Consola en Visual C++ (II) Cmo funciona el sistema de ventanas en Windows Artculo Anterior5 herramientas tiles para desarrolladores web

Autor:

Comentarios (4)
jose dice: julio 23, 2010 a las 2:51 pm Muy bueno Responder m3nt3.!f dice: enero 25, 2011 a las 8:40 pm pdta: gran post. Aprend mucho,

Responder Francisco dice: julio 8, 2011 a las 12:40 pm Saludos, buen tutorial, aunque slo es para funciones, pero cmo hago no para exportar e importar clases? Responder david dice: agosto 18, 2011 a las 3:51 am Muy interesante, espero que publiques mas articulos. Responder

Deja un comentario

9 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Nombre (obligatorio) E-Mail (no ser publicado) (obligatorio) Pgina web

copstone
Me gusta 394 copstone en Facebook

ltimos artculos
Trabajando con Word en Visual Studio 2010 y C# ASP.NET y MVC 3Parte I Model View Controller Cmo crear una aplicacin multihilos (multithread). AutoResetEvent vs. BackgroundWorker en Visual Studio 2008, C# Manejando la Cultura en nuestras Aplicaciones

Etiquetas

.Net ADO.Net Aero AJAX apache API Aplicaciones C# cipher css Dibujo encriptacion Entorno Visual hash html iis
javascript jQuery js Jump List Linux mcrypt Mensajes MVC MySQL Notification PDF php regedit SendInput Servidor web SOA soap
tabsheet Taskbar

TCSH Tray Visual

Studio WCF Web web service Windows Windows 7 xml-rpc XMLHttpRequest

Otros artculos
En este artculo te muestro como simular el teclado en Windows, es decir, cmo hacer que un programa escriba en el teclado por nosotros. No te imaginas lo til que puede ser este conocimiento as que te recomiendo que le des una leda.

Desde ya hace algunos aos existe el concepto de Web 2.0, si tienes una web o estas empezando en este mundo, RSS es una de las alternativas que te brinda esta evolucin. Lee este post y entrate de que se trata.

Quieres que tus archivos se ejecuten con tu programa en lugar de que Windows te pregunte con que programa deseas abrirlo? Adems quieres que tus archivos automticamente obtengan un cono dependiendo
10 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

de la extensin que uses? Si es as entonces este artculo es para ti.

Dentro de System hay varias clases, una de ellas nos permite interactuar con Archivos. En este post te enseo a interactuar con archivos de Texto para que aumentes la productividad de tus aplicaciones

Sean amigas o enemigas, las funciones siempre son tiles, nos evitan estar reescribiendo el mismo cdigo una y otra vez y nos dan la posibilidad de hacer nuestro cdigo ms claro y entendible.

ltimos comentarios
andres en Cmo crear una aplicacin multihilos (multithread). AutoResetEvent vs. BackgroundWorker en Visual Studio 2008, C# Yelinna en Seleccionar contenido vertical Yelinna en Punteros a Funciones Yelinna en Abrir aplicaciones externas desde C++ Yelinna en Interceptando los mensajes de windows

Calendario
marzo 2010 L M X J V S D 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 feb abr

Paginas de inters
Dot Cpp Netsei Top coder

Categoras
HOME Algoritmos (1) Artculos (23) Articulos (3) Consola (2) css (2)
11 de 13 05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Entorno Visual (9) Hardware (1) html (2) javascript (5) Lenguaje (2) Linux (1) net (16) noticias (2) Otros (5) php (5) Productividad (28) Shell (3) Sintaxis (6) Trucos (9) Web (6) Windows (4)

Comparte este artculo

TIENES ALGO QUE PREGUNTAR? ESCRBENOS AQU

Acerca de
Copstone significa "Piedra angular" y hemos decidido llamar as a nuestro Blog. Aunque a veces podemos discutir entre lo libre o lo pagado, que un lenguaje de programacin es mejor que otro, que entre verde, naranja o amarillo est el mejor color, hay algo que si compartimos y en el que estamos totalmente de acuerdo: la programacin es la piedra angular de un buen software. Conoce ms acerca de Copstone

Sugerencias
Este blog est dedicado a t y queremos darte siempre lo mejor as que si tienes alguna recomendacin o si te interesa que hablemos sobre algn tema en particular por favor no dudes en escribirnos. Escrbenos

12 de 13

05/11/2012 17:39

Creando y consumiendo DLLs con C++ | Programando por diversion

http://copstone.com/2010/03/creando-y-consumiendo-dlls-con-c/

Visual FoxPro 10
Cross platform Visual FoxPro. Windows/OS X/Linux/Cloud/Mobile
www.lianja.com

PowerBasic vs VisualBasic
Faster. No Run-Times. No Bloat! CGI, Macros, ASM, Reg Expressions
www.powerbasic.com

Generation of Source Code


.NET, Java, C++, XSD, DDL, PHP, CORBA, Python & more. Free Trial!
www.sparxsystems.com

Copyright 2012 - Programando por diversion Subir

13 de 13

05/11/2012 17:39

Potrebbero piacerti anche