Manual de como crear archivos dll y como utilizarlo desde un exe en dev c++

Iniciado por P[i], 15 Octubre 2005, 14:16 PM

0 Miembros y 1 Visitante están viendo este tema.

P[i]

 Ma burria y me puse a crear esto, bueno espero que le ayude a alguien:
1º) Abrimos un nuevo proyecto de tipo dll, en c. Ponle un nombre ( ej: dll ) y guardalo en una carpeta pj: c:\hola\.

2º) Te aparecen dos archivos, dll.h y dllmain.c. Guardalos en la carpeta del proyecto y vamos a comentar su contenido:

dll.h :

#ifndef _DLL_H_                // Esta y el siguiente es para definir donde empieza y acaba la cabezera.
#define _DLL_H_

#if BUILDING_DLL // Si el archivo se esta compilando salta esta, que exporta la dll
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */  // Si no esta compilando ( osea se esta llamando) salta esta, que importa la dll
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */ // cerramos el if


DLLIMPORT void HelloWord(void); // esta es la funcion que definiremos despues. podemos definir tantas funciones como keramos y es igual que una funcion normal solo que llega DLLIMPORT escrito antes del tipo de funcion que es.
/* Un ejemplo de mas
DLLIMPORT int suma(int x, int y); // esta es conocida o no.
*/

#endif /* _DLL_H_ */ // aki se acaba la cabezera.


dllmain.c :


/* Replace "dll.h" with the name of your header */
#include "dll.h"                            //Cabezera creada antes.
#include <windows.h>                 //Cabezeras.
#include <stdio.h>
#include <stdlib.h>

DLLIMPORT void HelloWorld ()     // aki definimos nuestras funciones.
{
    MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION);
}
/* Del ejemplo anterior de la suma kedaria.
DLLIMPORT int suma(int x, int y)
{
int q;
q = x+y;
return q;
}
*/

// Esto es la funcion principal de las dll, lo que hace es que se prepara para cuando un proceso o suceso la llama, no se modifica, es siempre la misma aunke pongas muchas funciones.
BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}


Bien visto eso, creo que ya esta, ahora le damos a compilar.

3º) Miramos en la carpeta donde teniamos el proyecto y nos salen unos cuantos archivos.
El dll.h y dllmain.c ( ya los explike), el del proyecto.dev, el resultado de la compilacion dll.dll ( simpre tiene que ir con el archivo .exe que crearemos despues, otro llamado libdll.def ( no nos interesa) y libdll.a ( el importante, al que linkearemos nuestro exe ).

4º) Cerramos el proyecto de la dll y abrimos uno nuevo de windows o ms-dos, en c o en c++ a tu eleccion. Le ponemos un nombre al proyecto ( ej: hola ),( yo hare para el manual un de ms-dos en c). Nos aparece un archivo llamdo main.c ( ya conocido por todos ) donde tiene lo basico y nosotros le añadimos unas cosas para que kede asi:


#include <stdio.h> // cabezeras estandar
#include <stdlib.h>
#include "dll.h"      // la cabezera utilizada anteriormente.

int main(int argc, char *argv[]) // funcion principal del exe
{
  HelloWord(); // llamamos a la funcion que creamos y metimos en la dll.
  system("PAUSE");
  return 0;
}


5º) Ahora entes de compilar tenemos que linkear a la libreria libdll.a . Vamos a Proyecto/Opciones de proyecto a la pestaña Parametros, y debajo del cuadro blanco que pone Linker de damos a ese boton que pone añadir biblioteca o objeto. Buscamos la carpeta donde estamos trabajando y hacemos doble click en libdll.a ( que sera la unica que aparezca ).
Aceptamos y compilamos nuestro exe llamado hola.exe. Y como ves se ejecuta la funcion que esta en la dll.

Bueno, para crear una dll para una funcion como que no es muy recomendable pero si tienes una decenas empieza a ser util, sobre todo para juegos y cosas asi de gran tamaño.

Para cualkier duda o error que tuviese posten gracias.

Un saludo p.

sch3m4

muy bueno  ;) aquí pongo un link para hacerlo en VC++

http://alonso_m.tripod.com/visualc/creardll.htm
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

Pseudoroot

www.g e d z a c.com

www.espavirus.com/foro

zonahurbana

Cita de: Pi] link=topic=90703.msg424609#msg424609 date=1129378595]Bueno, para crear una dll para una funcion como que no es muy recomendable pero si tienes una decenas empieza a ser util, sobre todo para juegos y cosas asi de gran tamaño.

No entiendo muy bien... es decir, cuando he creado muchas funciones es conveniente crear librerías con ellas, ¿cierto?
¿y seguir estos pasos para las DLLs me permite reducir el tamaño del .exe?

Yo de momento sólo sé realizar programas básicos en C++, sin interfaz gráfica. Sin embargo, una vez que tomé el .exe de uno de mis programas y lo llevé a otra computadora, simplemente no funcionaba, me decía que faltaban algunas DLL. El pequeño programa en consola (win32) lo hice en Visual Studio, ¿será que VS agrega cosas innecesarias y que por eso se requieren DLLs?
Era un programa sencillísimo, de los primeros que hice, y aún así no se podía ejecutar en dicha máquina xd
No ocurre cuando se los envío a compañeros que sí tienen instalado el VS.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...