Comunidad MUNDOTE



Autor Tema: Creando una DLL con C++  (Leído 1401 veces)

Wolfaint

  • Visitante
Creando una DLL con C++
« : 05 de agosto de 2006, 07:36:13 pm »
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 aqui 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.
« Última Modificación: 06 de agosto de 2006, 05:21:46 pm por king_arthur »

king_arthur

  • Visitante
Re: Creando una DLL con C++
« Respuesta #1 : 05 de agosto de 2006, 11:13:58 pm »
Muy buen aporte!!!  ;D

Solo que tengo un par de dudillas  ::)

Para crear librerias .dll en C++, lo puedes hacer mediante otro programa, en vez de visual C++ (ya que no lo tengo :P ) , digamos en turbo C++, o borland ???

Y cuando el programa ya esta en .exe necesita a fuerzas tener la libreria .dll  para que se ejecute??

Saludos
King_Arthur


Wolfaint

  • Visitante
Re: Creando una DLL con C++
« Respuesta #2 : 06 de agosto de 2006, 03:37:31 pm »
De ke se puede, se puede.. en c++ se han construido TODOS los grandes programas(noo recuerdo si fue gta, pero uno de los juegos mas nuevosa y vchindos afirmo a ver construido la totalidad de su motor en c++)

como hacerlo en borland.. pss no sepo xDDD se batalla, es mas rapido en Visual c++

La liberia la debes poner ... bueno mira.. pss deberas aprender ha hacer instaladores..  pero basicamente desde el codigo de c++ seria algo asi(teoricamente)


main()
{
variabledelprogramakenecesitalalibreia=liberiadewolfaint(int variable1,int Variable2)
lokenesesito=2*variabledelprogramakenecesitalalibreia
}

explicaciones de variables
1.-variabledelprogramakenecesitalalibreia, es el uso ke le daremos a la libreria
2.-liberiadewolfaint(int variable1,int Variable2) si notas se usa justo como funcion.. claro ke debes decirle al programa previamente donde esta la dll digamos c:/Mkd/Aplicacion/programamio/libreiras
3.-lokenesesito, simple bvariable ke sirve pa ejemplificar ke era una multiplicacion por 2...

espero ke lo entiendas... y pss asle un stick al tema

king_arthur

  • Visitante
Re: Creando una DLL con C++
« Respuesta #3 : 06 de agosto de 2006, 05:24:04 pm »
Pues voy a descargarme el visual c++ para probarlo :P , ya que el que tengo instalado es broland y turbo C++

A peticion tuya lo modifique para que quedara sticky ;)

 

Copyright © Diseño Staff Mundote