Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: patilanz en 29 Diciembre 2014, 01:54 am



Título: Crear dll dinamicos
Publicado por: patilanz en 29 Diciembre 2014, 01:54 am
Estoy intentando hacer un dll para después poder utilizar su función.

Desde visual studio 2013 creo nuevo proyecto de consola win32 vació. Luego le agrego un archivo hpp y cpp. Compilo. Me sale el dll.

Creo otro proyecto y lo intento cargar con:
Código
  1. #include <Windows.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. typedef void(* F)();
  7.  
  8. #pragma comment(lib,"dll_test1.lib")
  9.  
  10.  
  11. int main(){
  12. HMODULE library = LoadLibraryA("dll_test1.dll");
  13. if (library){
  14. cout << "ok";
  15. }
  16. F ptr = (F)GetProcAddress(library, "sumar");
  17.  
  18.  
  19. (*ptr)();
  20.  
  21. getchar();
  22.  
  23. return 0;
  24. }

Me carga bien la library pero luego me sale error al intentar utilizar la función.
Con Alternate DLL Analyzer vi que en la dll no hay funciones.
Que hago mal?

Saludos

@Edit: Los codigo del dll

dll_test.hpp
Código
  1. __declspec (dllexport) void sumar();
dll_test.cpp
Código
  1. #include <iostream>
  2. __declspec(dllexport) void sumar(){
  3. std::cout << "Functiona!";
  4. }


Título: Re: Crear dll dinamicos
Publicado por: MCKSys Argentina en 29 Diciembre 2014, 04:57 am
Si la DLL tiene la función exportada, entonces el error parece estar cuando haces GetProcAddress. El nombre de la función es sumar, no function.

Saludos!


Título: Re: Crear dll dinamicos
Publicado por: patilanz en 29 Diciembre 2014, 13:46 pm
Ya me di cuanta del error pero sigue igual .No es por el nombre. Ya lo cambie arriba.


Título: Re: Crear dll dinamicos
Publicado por: ivancea96 en 29 Diciembre 2014, 15:13 pm
Tal vez poniéndole extern "C"{ /* función en el .h */?

Es la única diferencia que logro ver entre tu DLL y las mías xD


Título: Re: Crear dll dinamicos
Publicado por: BloodSharp en 29 Diciembre 2014, 16:36 pm
El error lo tenés en la declaración de función de tu dll...

Código
  1. __declspec(dllexport) void sumar()

...cuando debería ser:

Código
  1. __declspec(dllexport)int sumar(int a,int b)

Que raro que hasta ahora nadie se haya dado cuenta. :laugh:


B#


Título: Re: Crear dll dinamicos
Publicado por: patilanz en 29 Diciembre 2014, 17:14 pm
La verdad es que he publicado diferentes códigos  :rolleyes: Publique la versión antigua que probé (int sumar(int,int)) y luego lo cambie por void para probar algo mas simple pero seguía igual:

Ahora es así:

Código
  1. #include <Windows.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. typedef void(* F)();
  7.  
  8. #pragma comment(lib,"dll_test1.lib")
  9.  
  10.  
  11. int main(){
  12. HMODULE library = LoadLibraryA("dll_test1.dll");
  13. if (library){
  14. cout << "ok";
  15. }
  16. F ptr = (F)GetProcAddress(library, "sumar");
  17.  
  18.  
  19. (*ptr)();
  20.  
  21. getchar();
  22.  
  23. return 0;
  24. }

Código
  1. __declspec (dllexport) void sumar();

Código
  1. #include <iostream>
  2. __declspec(dllexport) void sumar(){
  3. std::cout << "Functiona!";
  4. }

Perdón por el lió pero sigue sin funcionar.

ivancea96 donde se agrega lo de extern?

Lo edite también arriba


Título: Re: Crear dll dinamicos
Publicado por: ivancea96 en 29 Diciembre 2014, 19:07 pm
Código
  1. extern "C"{
  2.    __declspec (dllexport) void sumar();
  3. }

Prueba eso.


Título: Re: Crear dll dinamicos
Publicado por: patilanz en 29 Diciembre 2014, 19:36 pm
Funciona  ;-)!
Ahora estoy leyendo que es exactamente lo que hace pero tengo otra duda.
Si creo dos funciones que tienen diferentes argumentos como los llamo porque GetProcAddress solo me deja poner el nombre ? Y para clases ?
He visto que si quito el lib que me genera también funciona. Que contiene y es necesario?

Gracias

@Edit: extern "C" es solo para visual studio?


Título: Re: Crear dll dinamicos
Publicado por: ivancea96 en 29 Diciembre 2014, 20:34 pm
Tengo entendido que extern "C" indica que la función es compilada al estilo de C, y no C++.

Que yo sepa, no se pueden exportar clases a DLL. Pero bueno, http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL (http://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL) no parece coincidir. No sé si esa solución sirve en todos los compiladores, pero bueno.

Para lo de sobrecargar funciones, ya no sé. Según he mirado, puede tener que ver el archivo '.def', pero yo no lo sé utilizar. (.def with LoadLibrary() (http://www.vbforums.com/showthread.php?146626-def-files-with-LoadLibrary()-(DLL-s)))