Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: davrodgar1 en 13 Marzo 2017, 15:12 pm



Título: Usar una dll en MinGw
Publicado por: davrodgar1 en 13 Marzo 2017, 15:12 pm
Buenas,

Como indica el titulo quiero llamar a una función de una dll, aunque el objetivo final es crear una dll donde se use una función que se llama de una dll aun me encuentro en el primer paso.

Cuento con una dll creada por un tercero por lo que poco puede responder sobre ella, además cuento con un .h de la misma.

Por ahora he intentando llevar a cabo este programa

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <iostream>
  4.  
  5.  
  6. typedef double (CALLBACK* CPType)(const char *Output, const char *Name1, double Prop1, const char *Name2, double Prop2, const char *Ref); // Prototipo para poder utilizar Coolprops
  7.  
  8.  
  9. HINSTANCE dllHandle;
  10. CPType CPPtr;
  11.  
  12. int main(void){
  13. double ro;
  14. dllHandle = LoadLibrary("CoolProp.dll");
  15. if (!dllHandle) {
  16.      std::cout << "Error en la carga dll\n";
  17.   } else {
  18.  
  19. CPPtr = (CPType)GetProcAddress(dllHandle,"PropsSI");
  20.  
  21.  
  22. ro = CPPtr("D","P",100000,"T",273.15,"water");
  23. std::cout<<ro;
  24.  
  25. }
  26. system("PAUSE");
  27. return 0;
  28.  
  29. }

pero no carga la dll correctamente, saltando siempre el mensaje Error en la carga dll.

Para compilar estoy usando MinGw, estando en una misma carpeta la dll y el cpp por medio del comando g++ -o ejecutable código.cpp

Un saludo,
David


· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Usar una dll en MinGw
Publicado por: Borito30 en 15 Marzo 2017, 16:55 pm
Para cargar la libreria:
Código
  1. HINSTANCE hGetProcIDDLL = LoadLibrary("libreria");´

Para resolver su funcion:
Código
  1. f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "funci");
  2.  if (!funci) {
  3.    std::cout << "could not locate the function" << std::endl;
  4.    return EXIT_FAILURE;
  5.  }

En la dll le defines el export para poder utilizarla:
Código
  1. int __declspec(dllexport) __stdcall funci() {
  2.   // ...
  3. }


Título: Re: Usar una dll en MinGw
Publicado por: ivancea96 en 15 Marzo 2017, 16:59 pm
Si hay un error, el código del error lo obtendrás llamando a GetLastError (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx). Para ver el texto de ese código de error, tienes la función Formatmessage (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx). De todos modos, si no quieres utilizar FormatMessage, tienes esta web con los códigos de error: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx)