Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: zeui en 26 Julio 2010, 22:46 pm



Título: como Llamar a una Dll desde otra
Publicado por: zeui en 26 Julio 2010, 22:46 pm
hola, bueno. emm... resulta que no soy bueno programando con Cpp, nunca e aprendido a usarlo bien y menos llegue a aprender como integrar Api's dentro de mi codigo.
pero ahora tengo este requisito para poder hacer llamada a la Dll que llamaria a otra Dll en ruby ( que es el lenguaje que estoy usando hace un buen tiempo )

he estado intentando y hasta el momento no e logrado mucho.

cree una dll con la funcion "suma"
al llamarla desde ruby funciona a la perfeccion.

pero cree otra dll, la que llama a la funcion "suma" de la dll anterior
y al llamarla desde ruby simplemente esta dll no puede me tira false al usar la funcion LoadLibrary para llamar a la Dll.

que error puedo estar comentiendo?, me ayudan. porfavor :S


Título: Re: como Llamar a una Dll desde otra
Publicado por: Eternal Idol en 27 Julio 2010, 12:44 pm
LoadLibrary carga una DLL en memoria. Comproba que el nombre sea correcto y este en la ruta de busqueda:

LoadLibrary (http://msdn.microsoft.com/en-us/library/ms684175%28VS.85%29.aspx).


Título: Re: como Llamar a una Dll desde otra
Publicado por: zeui en 28 Julio 2010, 04:51 am
si se como llamar a una dll, pero no me a funcionado. la simple funcion no me va a servir, como dije. no tengo muchos conocimientos de C++.

estoy acostumbrado a usar Ruby, dinamico, simple, hermoso, pero lamentablemente mucho mas lento...

nesecito mas que una simple "funcion"

seria mucha molestia si pido un codigo ejemplo :X?


Título: Re: como Llamar a una Dll desde otra
Publicado por: Eternal Idol en 28 Julio 2010, 09:01 am
Ya te deje codigo de ejemplo en el enlace anterior que no debes haber visitado.
Pone TU codigo que no funciona y antes que nada usa GetLastError para ver que error devuelve la funcion.


Título: Re: como Llamar a una Dll desde otra
Publicado por: zeui en 29 Julio 2010, 05:37 am
mi codigo de la dll que llama a otra es este.

main.cpp
Código:

/* dllmain.cpp */

#include "dll.h"
#include <windows.h>
#include <cstdlib>
#include <iostream>



/*----------------------------*/
/*         llamada dll        */
/*----------------------------*/
extern "C" _declspec(dllexport)
int suma_int(int a, int b)
{    
     typedef int (WINAPI*cfunc1)(int, int);
     cfunc1 ConexionDLL1;          
    
     int res = 0;    
     HINSTANCE hLib;        
     hLib = LoadLibrary("Jmysql2");
 
     if(hLib!=0)
     {
          ConexionDLL1 = (int (__stdcall *) (int, int)) GetProcAddress(hLib,"suma");
          res = ConexionDLL1(a, b);                                        
     }
     else
     {
         res = 2;
         FreeLibrary(hLib);
     }  
    
     return res;            
}




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;
}



dll.h

Código:
/* dll.h */

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


#endif /* _DLL_H_ */



esta dll llama a la funcion suma de la dll "Jmysql2" ( obviamente solo suma, es para probar si me funciona... )  (en load library intente con poner la extensión dll y sin dll, vi codigos de ejemplo con ambas opciones)

al probar el codigo (desde ruby) la funcion suma de "Jmysql2" esta funciona perfectamente, pero mi problema radica mas en el codigo que e puesto aqui arriba donde intento cargar una dll dentro de otra.

p.s: respecto al sitio de msdn, estoy revisando los ejemplos posteados por usuarios. pido perdon, en ningun momento revise ese lugar ...

EDIT:---
tal como dije arriba, no se usar C++ X.x, ayuda por favor...


Título: Re: como Llamar a una Dll desde otra
Publicado por: Eternal Idol en 29 Julio 2010, 09:25 am
En lugar de intentar descagar una DLL que no se cargo, cosa que no tiene sentido, en caso de error pone esto:

Código
  1. res = 2;
  2. DWORD err = GetLastError();
  3. res = err; //es solo para depurarlo mas comodamente
  4.  

Depura el programa y fijate que valor toma err.

PD. ¿Probaste copiando la DLL Jmysql2.dll en el path de TU DLL? Sino copiala en WINDOWS\SYSTEM32.