Crear dll dinamicos

Iniciado por patilanz, 29 Diciembre 2014, 01:54 AM

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

patilanz

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 (cpp) [Seleccionar]
#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
Código (cpp) [Seleccionar]
__declspec (dllexport) void sumar();
dll_test.cpp
Código (cpp) [Seleccionar]
#include <iostream>
__declspec(dllexport) void sumar(){
std::cout << "Functiona!";
}

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


patilanz

Ya me di cuanta del error pero sigue igual .No es por el nombre. Ya lo cambie arriba.

ivancea96

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

BloodSharp

El error lo tenés en la declaración de función de tu dll...

Código (cpp) [Seleccionar]
__declspec(dllexport) void sumar()

...cuando debería ser:

Código (cpp) [Seleccionar]
__declspec(dllexport)int sumar(int a,int b)

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


B#



patilanz

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 (cpp) [Seleccionar]
#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;
}


Código (cpp) [Seleccionar]
__declspec (dllexport) void sumar();

Código (cpp) [Seleccionar]
#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

ivancea96

Código (cpp) [Seleccionar]
extern "C"{
    __declspec (dllexport) void sumar();
}


Prueba eso.

patilanz

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?

ivancea96

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 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())