• Sábado 1 de Junio de 2024, 08:05

Autor Tema:  Ayuuuuuda C++ ... Por Favor  (Leído 2062 veces)

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Ayuuuuuda C++ ... Por Favor
« en: Miércoles 25 de Julio de 2007, 20:08 »
0
hola gente...

tengo un problema con el name mangling  al crear dlls en c++ de las funciones ... uso dev-c++ 4.9.9.1 (mingw el compilador).

pasa que los compiladores de c++ decoran los nombres de mis funciones con unos atributos que hacen complicado el acceso a las funciones con el nombre original...
Se como exportar las funciones independientes sin el decorado de nombres: ej
prototipo:
Código: Text
  1.  
  2. extern "C" __declspec (dllexport) int myFunction(int a, float b);
  3.  
  4.  
y la implementacion que ya es obvia...
Pero el problema surge al intentar exportar las funciones miembro (o las propiedades), la interfaz publica general de mi clase, me decora el nombre con su rompebolas "seguridad de tipos c++" y no puedo acceder a la funcion con el nombre original ...
por favor, si alguien conoce la solucion, por favor, deganmela...

gracias desde ya!

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #1 en: Jueves 26 de Julio de 2007, 06:12 »
0
¿no funciona con esto?

Código: Text
  1.  
  2. extern "C" {
  3.   // código
  4. }
  5.  
  6.  
La imaginación es el límite.
Hardware & Software | Mexchip

Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #2 en: Jueves 26 de Julio de 2007, 15:03 »
0
tenes que exportarlas con listas ".def", no con __declspec (dllexport), te quedaría algo así:

"mydlldef.def":

    LIBRARY MYDLL //Nombre de nuestra DLL
    DESCRIPTION 'Librería de ejemplo'

    EXPORTS //Funciones Exportadas
        myFunction @ 1
        myFunction2 @ 2
        myFunction3 @ 3

Cualquier cosa fijate en mi web en la parte de vinculación de librerías

S2

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #3 en: Domingo 29 de Julio de 2007, 19:27 »
0
Pero el fichero .def me crea automaticamente y cambiar los nombres de las funciones no hace nada... cuando abro la dll con el dependency walker puedo ver la funcion con el nombre decorado...

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #4 en: Domingo 29 de Julio de 2007, 19:29 »
0
Pasame el link del articulo en tu pagina, porque no lo encuentro

Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #5 en: Lunes 30 de Julio de 2007, 00:27 »
0
No importa que el compilador te cree un fichero .def, no tiene nada que ver... fijate acá:

Vinculando Librerías

S2

Castord

  • Nuevo Miembro
  • *
  • Mensajes: 20
    • Ver Perfil
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #6 en: Miércoles 1 de Agosto de 2007, 21:06 »
0
No me funca

Karman, por favor pone un ejemplo de exportar clases con c++ en una dll...

Gracias!

Karman

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
    • http://www.inexinferis.com.ar
Re: Ayuuuuuda C++ ... Por Favor
« Respuesta #7 en: Miércoles 1 de Agosto de 2007, 22:26 »
0
Mirá... básicamente existen dos formas de importar funciones de una DLL en c++, la primera (y más orientada a objetos), exportando la clase; la segunda (y más orientada a su uso en general pudiendo ser usada en C) mediante Wrapper (algo así como sobreescritura), y ahora que lo pienso tendría que hacer un artículo sobre esto tb... je... volviendo al tema, como yo te decía era de la segunda forma, pero supongo que vos necesitas orientada a objetos pura, entonces el método es el siguiente:

Código DLL:
dll.h:
Código: Text
  1.  
  2. #ifndef _DLL_H_
  3. #define _DLL_H_
  4.  
  5. #define DLLExport   __declspec (dllexport)
  6.  
  7. class DLLExport DllClass{
  8.   public:
  9.     DllClass();
  10.     virtual ~DllClass(void);
  11.     void Hello(void);
  12.   private:
  13. };
  14.  
  15. #endif /* _DLL_H_ */
  16.  
  17.  

dll.cpp:

Código: Text
  1.  
  2. #include <windows.h>
  3. #include "dll.h"
  4.  
  5. void DllClass::Hello(){
  6.   MessageBox(0,"hola","holaa",0);
  7. }
  8.  
  9. DllClass::DllClass(){}
  10. DllClass::~DllClass (){}
  11.  
  12. BOOL APIENTRY DllMain (HINSTANCE hInst,DWORD reason,LPVOID reserved){
  13.   switch (reason){
  14.      case DLL_PROCESS_ATTACH:
  15.      break;
  16.   }
  17.   return TRUE;
  18. }
  19.  
  20.  

Código Programa:
main.h:
Código: Text
  1.  
  2. #ifndef _DLL_H_
  3. #define _DLL_H_
  4.  
  5. #define DllImport __declspec (dllimport)
  6.  
  7. class DllImport DllClass{
  8.   public:
  9.     DllClass();
  10.     virtual ~DllClass(void);
  11.     void Hello(void);
  12.   private:
  13. };
  14.  
  15. #endif /* _DLL_H_ */
  16.  
  17.  

main.cpp:
Código: Text
  1.  
  2. #include <windows.h>
  3. #include <cstdlib>
  4. #include "main.h"
  5.  
  6. DllClass dllclass;
  7.  
  8. int main(int argc, char *argv[]){
  9.   dllclass.Hello();
  10.   system("PAUSE");
  11.   return EXIT_SUCCESS;
  12. }
  13.  
  14.  

el otro método se diferencia porque se definen wrappers o dicho de otra manera, se sobreescriben las funciones:

Código: Text
  1.  
  2. void *CrearObj(void){
  3.    DllClass *tmp;
  4.    tmp=new DllClass;
  5.    return (void *)tmp;
  6. }
  7.  
  8. void EliminarObj(void *obj){
  9.    DllClass *tmp;
  10.    tmp=(DllClass *)obj;
  11.    delete tmp;
  12. }
  13.  
  14. void Hello(void *obj){
  15.    DllClass *tmp;
  16.    tmp=(DllClass *)obj;
  17.    tmp->Hello();
  18. }
  19.  
  20.  

y así suscesivamente...

S2