Desarrollo
Menú
Gamersmafia es ahora un archivo de solo lectura.

Hacer dlls con Visual Studio 2005 (C++)

Buenas,

Un colega y yo queríamos probar a hacer unas dlls, porque queremos hacer cierta aplicación en c++ y luego usar formularios en otro lenguaje de programación.

He estado haciendo pruebas sobre como hacer una dll y mas o menos he visto cual es el procedimiento en visual studio:

1) Archivo -> Nuevo… -> Proyecto -> Biblioteca de clases
2) Meto un procedimiento en el .cpp
3) Añado al proyecto un archivo .def
4) En el .def, añado la siguiente línea “EXPORTS nombredelprocedimiento”

Compilo y demás, y 0 errores.

Ahora bien, quiero hacerlo con POO, entonces pruebo a hacer una clase con un método de prueba, intento hacer el export, y me da error.

¿Como hago el EXPORT con métodos de una clase?

Hola,

Hasta el lunes no te puedo intentar ayudar. Aquí no tengo un mísero compilador.
¿’Googleaste’ el error?

Sip, pero es que el error que me da es un “fatal error LNK1120: 1 externos sin resolver”. Digamos que este error se puede dar en muchas circunstancias diferentes (no solo trabajando con dlls, puede ocurrir cuando defines un método en una clase pero no su implementación etc), así que aunque busque en google, encuentro poco info relacionada.

Hola,

Ese mensaje en principio parece provocado por detectar que te falta una vinculación a una lib.
Imagino que habrás puesto todas las necesarias. Hay un bug que puede generar este mismo mensaje:

https://support.microsoft.com/kb/894573/es

En resumen es incluir una lib de bufferoverflow que parece que necesita.

Si esto no te vale, dame más detalles a ver si puedo reproducirlo yo.

Um… he mirado en mi visual studio y solo tenía una de esas tres lib, la u para ser más concretos. He probado y sigue sin funcionar.

Me he dado cuenta de que aparte del link error ese, hay otro más arriba referido al archivo de definición:

1>definicion.def : error LNK2001: símbolo externo prueba1 sin resolver

Por lo que he visto en MSDN…:
Export Problems

* When you are porting an application from 16 to 32 bits, LNK2001 can occur. The current 32-bit module-definition (.def) file syntax requires that __cdecl, __stdcall, and __fastcall functions be listed in the EXPORTS section without underscores (undecorated). This differs from the 16-bit syntax, where they must be listed with underscores (decorated). For more information, see the description of the EXPORTS section of module-definition files.
* Any export listed in the .def file and not found will cause LNK2001. This could be because it does not exist, is spelled incorrectly, or uses C++ decorated names (.def files do not take decorated names)

Pero yo no tengo ninguna función __cedcl, __stdcall ni __fastcall.

En tal caso parece que la sintaxis de EXPORTS prueba1 para exportar el método de una clase, no es correcta.

En resumen, tengo dos errores, que deben estar relacionados entre sí:

1>definicion.def : error LNK2001: símbolo externo prueba1 sin resolver
1>D:\Programacion\prob\prueba\Debug\prueba.lib : fatal error LNK1120: 1 externos sin resolver

prueba1 es el método que intento exportar de la clase ClasePrueba que me creé para experimentar.

Hola,

Ambos errores están indicando lo mismo. Tienes el .def incompleto o mal escrito.
Los mensajes lo indican, o te falta algún fichero que hayas definido en el .def o lo has escrito mal.
Al intentar linkar el fichero salta el error.
No creo que el problema sea el paso de 16 a 32 bits, céntrate en la segunda parte de la explicación:

“Any export listed in the .def file and not found will cause LNK2001. This could be because it does not exist, is spelled incorrectly or ..”

Recuerda que las mayúsculas son sensitivas por defecto.
Para poder ayudarte más, tendría que acceder al código que has escrito para reproducir el error.
De todas formas a lo largo del día intentaré bajarme el compilador y probar con un ejemplo.

Comentario #5 por SinSa:
Hola,

Ambos errores están indicando lo mismo. Tienes el .def incompleto o mal escrito.
Los mensajes lo indican, o te falta algún fichero que hayas definido en el .def o lo has escrito mal.
Al intentar linkar el fichero salta el error.
No creo que el problema sea el paso de 16 a 32 bits, céntrate en la segunda parte de la explicación:

“Any export listed in the .def file and not found will cause LNK2001. This could be because it does not exist, is spelled incorrectly or ..”

Recuerda que las mayúsculas son sensitivas por defecto.
Para poder ayudarte más, tendría que acceder al código que has escrito para reproducir el error.
De todas formas a lo largo del día intentaré bajarme el compilador y probar con un ejemplo.

piro a la uni, luego cuando vuelva, te paso el código que tengo.

Comentario #6 por Flash-Hack:
#5 piro a la uni, luego cuando vuelva, te paso el código que tengo.

yo tengo el compi instalado, si quieres me pasas el código y pruebo, auqnue supongo que como bien leí por ahi arriba sea alguna mayúscula mal puesta o algo así…

a mi no me mola mucho este compilador, esta haciendo el proyecto final del cliclo en un form, lo guardaba, lo metía al pendrive y al abrirlo en casa me “desasociaba” el designer del form al código y era como si el form no existiera, pero miraba en el pendrive y efectiviwonder ahi estaba el archivo… al final lo que tenía que hacer era un proyecto nuevo para que generara un form en blanco, y hacer un cambiazo en la carpeta del proyecto, vamos que un engorro ainss… supongo que Sinsa tendrá bastante más idea que yo del tema, pero si puedo ayudar o algo me dices, porque el error te lo da al exportar, no al compilar no?

Hola,

Comentario #7 por ZeNNeR:
#6 yo tengo el compi instalado, si quieres me pasas el código y pruebo, auqnue supongo que como bien leí por ahi arriba sea alguna mayúscula mal puesta o algo así…

a mi no me mola mucho este compilador, esta haciendo el proyecto final del cliclo en un form, lo guardaba, lo metía al pendrive y al abrirlo en casa me “desasociaba” el designer del form al código y era como si el form no existiera, pero miraba en el pendrive y efectiviwonder ahi estaba el archivo… al final lo que tenía que hacer era un proyecto nuevo para que generara un form en blanco, y hacer un cambiazo en la carpeta del proyecto, vamos que un engorro ainss… supongo que Sinsa tendrá bastante más idea que yo del tema, pero si puedo ayudar o algo me dices, porque el error te lo da al exportar, no al compilar no?

Si, el error es en el linkaje, no en la compilación.

Comentario #8 por SinSa:
Hola,

#7 Si, el error es en el linkaje, no en la compilación.

oki, los errores en linkado suelen ser rarotes, por lo menos a mí en mi poca experiencia me habrán saltado 2 o 3 y eran porque me faltaba algo o tenía algo mal escrito normalmente… nose soy un n00b eso tb os lo digo

Bueno, ya estoy de vuelta.

como ya digo, de todas formas, el export me funciona bien cuando voy a exportar un procedimiento normal y corriente. Cuando quiero exportar métodos de una clase, es cuando me da error, así que la sintaxis debe de ser distinta para exportar dichos métodos.

Veamos, mi proyecto de prueba: (Hay dos procs, uno que es prueba1 y otro prueba2, el que no funca es el prueba1)

https://www.mediafire.com/download.php?ezzofdgtnid

Tengo otro proyecto para comprobar que el resultado de la dll, pero creo que no lo necesitaréis, si lo necesitais, pedidmelo.

PD: Gracias por las ayudas hasta el momento

Hola,

Ayer tuve un rato y volqué tu proyecto.
En principio al ponerlo en modo release me genera el error famoso de la dll ‘bufferoverflow’.
Pero en modo debug conseguí reproducir tu error del .def.
Espero poder jugar un poquito hoy.

Hola,

He creado un nuevo proyecto.
He creado los tres ficheros en principio necesarios:

prueba.h
prueba.cpp
prueba.def

He pegado el código de tus tres ficheros y no me da error de linkaje ni compilación (una vez eliminados los tres bufferoverflow del linkaje).

Sin embargo tu proyecto (tal cual lo he descomprimido) si me da el error..
Debe ser alguna chorradilla, cuando tenga un poco más de tiempo compararé a ver si veo algo.

Échale un vistazo a esto mientras:

https://www.geocities.com/sujitmanolikar/dllhowto.html

Los más activos en General
Subforos