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:
#include <Windows.h>
#include <iostream>
using namespace std;
typedef void(* F)();
#pragma comment(lib,"dll_test1.lib")
int main(){
HMODULE library = LoadLibraryA("dll_test1.dll");
if (library){
cout << "ok";
}
F ptr = (F)GetProcAddress(library, "sumar");
(*ptr)();
getchar();
return 0;
}
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
__declspec (dllexport) void sumar();
dll_test.cpp
#include <iostream>
__declspec(dllexport) void sumar(){
std::cout << "Functiona!";
}
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!
Ya me di cuanta del error pero sigue igual .No es por el nombre. Ya lo cambie arriba.
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
El error lo tenés en la declaración de función de tu dll...
__declspec(dllexport) void sumar()
...cuando debería ser:
__declspec(dllexport)int sumar(int a,int b)
Que raro que hasta ahora nadie se haya dado cuenta. :laugh:
B#
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í:
#include <Windows.h>
#include <iostream>
using namespace std;
typedef void(* F)();
#pragma comment(lib,"dll_test1.lib")
int main(){
HMODULE library = LoadLibraryA("dll_test1.dll");
if (library){
cout << "ok";
}
F ptr = (F)GetProcAddress(library, "sumar");
(*ptr)();
getchar();
return 0;
}
__declspec (dllexport) void sumar();
#include <iostream>
__declspec(dllexport) void sumar(){
std::cout << "Functiona!";
}
Perdón por el lió pero sigue sin funcionar.
ivancea96 donde se agrega lo de extern?
Lo edite también arriba
extern "C"{
__declspec (dllexport) void sumar();
}
Prueba eso.
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?
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)))