como Llamar a una Dll desde otra

Iniciado por zeui, 26 Julio 2010, 22:46 PM

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

zeui

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
[take all around]

Eternal Idol

LoadLibrary carga una DLL en memoria. Comproba que el nombre sea correcto y este en la ruta de busqueda:

LoadLibrary.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zeui

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?
[take all around]

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

zeui

#4
mi codigo de la dll que llama a otra es este.

main.cpp


/* 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


/* 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...
[take all around]

Eternal Idol

En lugar de intentar descagar una DLL que no se cargo, cosa que no tiene sentido, en caso de error pone esto:

Código (cpp) [Seleccionar]
res = 2;
DWORD err = GetLastError();
res = err; //es solo para depurarlo mas comodamente


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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón