elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Prueba leer la dll nativo con interfaz C++ nativo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Prueba leer la dll nativo con interfaz C++ nativo  (Leído 3,304 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Prueba leer la dll nativo con interfaz C++ nativo
« en: 6 Julio 2020, 00:49 am »

Hola:

Haciendo otras pruebas.

Creo el archivo dll.
Código
  1. #include "pch.h"
  2.  
  3. extern "C"
  4. {
  5.    __declspec(dllexport) LPTSTR __stdcall Mensaje();
  6.    __declspec(dllexport) float __stdcall Volumen(float, float, float, float);
  7.    __declspec(dllexport) float __stdcall Litros(float, float);
  8.    __declspec(dllexport) float __stdcall ResultadoPorcentaje(float, float, float);
  9.    __declspec(dllexport) float __stdcall VolumenLitros(float, float, float, float, float);
  10.    __declspec(dllexport) float __stdcall CantidadTubosLitros(float, float, float);
  11.    __declspec(dllexport) float __stdcall TotalLitros(float, float, float);
  12. };
  13.  
  14. // Mensaje.
  15. LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }
  16.  
  17. // Cálculo volumen.
  18. float __stdcall Volumen(float volumen, float PI, float radio, float altura)
  19. {
  20.    return volumen = PI * (radio * radio) * altura;
  21. }
  22.  
  23. // Cálculo litros.
  24. float __stdcall Litros(float litros, float volumen)
  25. {
  26.    return litros = volumen * 1000;
  27. }
  28.  
  29. // Cálculo porcentaje en % del litro de agua.
  30. float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
  31. {
  32.    return resultadoPorcentaje = nivelAgua * (100 / altura);
  33. }
  34.  
  35. // Cálculo litros de agua.
  36. float __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
  37. {
  38.    return volumenLitros = PI * (radio * radio) * nivelAgua;
  39.    return resultadoLitros = volumenLitros * 1000;
  40. }
  41.  
  42. // Cálculo litros por cantidad de tubos
  43. float __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
  44. {
  45.    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
  46. }
  47.  
  48. // Cálculo cantidad de litros con total de tubos.
  49. float __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
  50. {
  51.    return totalLitros = litros * cantidadTubos;
  52. }

Luego el deb.
Código
  1. LIBRARY DLL_al_poder
  2. EXPORTS
  3. Mensaje
  4. Volumen
  5. Litros
  6. ResultadoPorcentaje
  7. VolumenLitros
  8. CantidadTubosLitros
  9. TotalLitros

Y la interfaz de C++ nativo para que lea la dll.
Código
  1. #include <iostream>
  2. #include <windows.h> // Para mostrar texto en el título de la ventana.
  3.  
  4. using namespace std;
  5. //using std::cout;
  6. //using std::cin;
  7.  
  8. // Función posición del cursor.
  9. void gotoxy(int x, int y)
  10. {
  11. HANDLE hcon;
  12. hcon = GetStdHandle(STD_OUTPUT_HANDLE);
  13. COORD dwPos;
  14. dwPos.X = x;
  15. dwPos.Y = y;
  16. SetConsoleCursorPosition(hcon, dwPos);
  17. }
  18.  
  19. // Definir estas funciones.
  20. typedef LPTSTR(__stdcall* Mensaje)();
  21. typedef float(__stdcall* Volumen)(float, float, float, float);
  22. typedef float(__stdcall* Litros)(float, float);
  23. typedef float(__stdcall* ResultadoPorcentaje)(float, float, float);
  24. typedef float(__stdcall* VolumenLitros)(float, float, float, float, float);
  25. typedef float(__stdcall* CantidadTubosLitros)(float, float, float);
  26. typedef float(__stdcall* TotalLitros)(float, float, float);
  27.  
  28. int main(void)
  29. {
  30. // Variables.
  31. const double Pi = 3.14;
  32. float radio;
  33. float altura;
  34. //double volumen;
  35. //double litros;
  36. float nivelAgua;
  37. //float resultadoPorcentaje;
  38. //double resultadoLitros;
  39. //double volumenLitros;
  40. float mitadBarra;
  41. float cantidadTubos;
  42. //double cantidadTubosLitros;
  43. //double totalLitros;
  44.  
  45. // Importar dll.
  46. HINSTANCE hDLL = 0;
  47. Mensaje mensaje;
  48. Volumen volumen;
  49. Litros litros;
  50. ResultadoPorcentaje resultadoPorcentaje;
  51. VolumenLitros volumenLitros;
  52. CantidadTubosLitros cantidadTubosLitros;
  53. TotalLitros totalLitros;
  54.  
  55. hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
  56. mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
  57. volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
  58. litros = (Litros)GetProcAddress(hDLL, "Litros");
  59. resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
  60. volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
  61. cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
  62. totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");
  63.  
  64. // Mostrar caracteres correctamente en pantalla y título de la ventana.
  65. SetConsoleOutputCP(65001);
  66. wchar_t titulo[128];
  67. MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
  68. SetConsoleTitle(titulo);
  69.  
  70. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  71. SMALL_RECT r = { 0, 0, 49, 35 }; // X = 49, Y = 9.
  72. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  73.  
  74. // Ocultar cursor.
  75. CONSOLE_CURSOR_INFO cci;
  76. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  77. cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
  78. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  79.  
  80. // Posición del cursor.
  81. gotoxy(3, 2);
  82.  
  83. // Mostrar textos en pantalla.
  84. wcout << mensaje() << endl;
  85. gotoxy(0, 4);
  86. cout << "Introduce el radio en m.: ";
  87. cin >> radio;
  88. cout << "Introduce la altura en m. ";
  89. cin >> altura;
  90. cout << "Introduce altura del agua. Máximo es de " << altura << ":";
  91. cin >> nivelAgua;
  92. cout << "Introduces cantidad de tubos: ";
  93. cin >> cantidadTubos;
  94.  
  95. // ########## Dibujo de la barra.
  96. cout << "\n";
  97. cout << ("0 %                     50 %                   100 %") << endl;
  98. cout << ("&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;") << endl;
  99.  
  100. // Mitad de la barra para que no sea muy grande en la pantalla.
  101. mitadBarra = resultadoPorcentaje / 2;
  102.  
  103. if (mitadBarra > 50)
  104. {
  105. mitadBarra = 50;
  106. }
  107.  
  108. // Rellenar la barra.
  109. for (float i = 1; i <= mitadBarra; i++)
  110. {
  111. cout << ("&#9608;");
  112. }
  113.  
  114. // Si llega a 100 se pone el # en rojo.
  115.  
  116. if (resultadoPorcentaje > 100)
  117. {
  118. cout << ("#");
  119. }
  120. //########## Fin dibujo de la barra.
  121.  
  122. // Pisición del texto a mostrar.
  123. gotoxy(0, 11);
  124.  
  125. //cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";
  126.  
  127.  
  128. FreeLibrary(hDLL);
  129.  
  130. // Esperando pulsar Enter para salir.
  131. cin.get();
  132. return 0;

Me salen estos errores.


No logro solucionarlo.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #1 en: 6 Julio 2020, 09:22 am »

resultadoPorcentaje es un puntero a funcion, asi que tenes que llamarlo con sus tres parametros en estas dos lineas:


Código
  1. mitadBarra = resultadoPorcentaje / 2;
  2. if (resultadoPorcentaje > 100)


PD. Habilita la columna del numero de linea para los errores y/o ubicala antes de la descripcion.


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #2 en: 6 Julio 2020, 10:00 am »

Lo he puesto tiplo float a todos por si acaso.

Código:
	// Mitad de la barra para que no sea muy grande en la pantalla.
mitadBarra = resultadoPorcentaje(0, 0, 0) / 2;



Por lo que veo, tengo el diseño mal.

Código:
// Cálculo porcentaje en % del litro de agua.
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Ya que solamente necesito el valor de resultadoPorcentaje para añadirlo en un cout << "Tanto porciernto: " << resultadoPorcentaje << endl;
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #3 en: 6 Julio 2020, 10:09 am »

¿No cambiaste if (resultadoPorcentaje > 100), no?
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #4 en: 6 Julio 2020, 16:43 pm »

¿Qué iba a cambiar ahí exactamente?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #5 en: 6 Julio 2020, 17:10 pm »

resultadoPorcentaje sigue siendo un puntero a funcion asi que compararlo con > 100 no tiene ningun sentido, llamar a la funcion (con los parametros que correspondan) y comparar su resultado si puede tenerlo ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #6 en: 6 Julio 2020, 18:51 pm »

Entonces este cálculo que me hace falta debe estar en la interfaz, no en la dll.

Código
  1. mitadBarra = resultadoPorcentaje / 2;
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #7 en: 7 Julio 2020, 14:39 pm »

Voy hacerlo de otra manera. Por fin funciona.

Quito de la dll este código:
Código:
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

Este código de abajo lo pongo en la interfaz.
Código:
resultadoPorcentaje = nivelAgua * (100 / altura);

La dll si compila.
Código:
#include "pch.h"

extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) float __stdcall Volumen(float, float, float, float);
    __declspec(dllexport) float __stdcall Litros(float, float);
    //__declspec(dllexport) float __stdcall ResultadoPorcentaje(float, float, float);
    __declspec(dllexport) float __stdcall VolumenLitros(float, float, float, float, float);
    __declspec(dllexport) float __stdcall CantidadTubosLitros(float, float, float);
    __declspec(dllexport) float __stdcall TotalLitros(float, float, float);
};

// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }

// Cálculo volumen.
float __stdcall Volumen(float volumen, float PI, float radio, float altura)
{
    return volumen = PI * (radio * radio) * altura;
}

// Cálculo litros.
float __stdcall Litros(float litros, float volumen)
{
    return litros = volumen * 1000;
}

// Cálculo porcentaje en % del litro de agua.
//float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
//{
//    return resultadoPorcentaje = nivelAgua * (100 / altura);
//}

// Cálculo litros de agua.
float __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}

// Cálculo litros por cantidad de tubos
float __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}

// Cálculo cantidad de litros con total de tubos.
float __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}

Archivo .def lo dejo así:
Código:
LIBRARY DLL_al_poder
EXPORTS
Mensaje
Volumen
Litros
VolumenLitros
CantidadTubosLitros
TotalLitros

Código completo en la interfaz.
Código:
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.

using namespace std;
//using std::cout;
//using std::cin;

// Función posición del cursor.
void gotoxy(int x, int y)
{
HANDLE hcon;
hcon = GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X = x;
dwPos.Y = y;
SetConsoleCursorPosition(hcon, dwPos);
}

// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef float(__stdcall* Volumen)(float, float, float, float);
typedef float(__stdcall* Litros)(float, float);
//typedef float(__stdcall* ResultadoPorcentaje)(float, float, float);
typedef float(__stdcall* VolumenLitros)(float, float, float, float, float);
typedef float(__stdcall* CantidadTubosLitros)(float, float, float);
typedef float(__stdcall* TotalLitros)(float, float, float);

// Variables.
const double Pi = 3.14;
float radio;
float altura;
//double volumen;
//double litros;
float nivelAgua;
float resultadoPorcentaje;
//double resultadoLitros;
//double volumenLitros;
float mitadBarra;
float cantidadTubos;
//double cantidadTubosLitros;
//double totalLitros;

int main(void)
{
// Importar dll.
HINSTANCE hDLL = 0;
Mensaje mensaje;
Volumen volumen;
Litros litros;
//ResultadoPorcentaje resultadoPorcentaje;
VolumenLitros volumenLitros;
CantidadTubosLitros cantidadTubosLitros;
TotalLitros totalLitros;

hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
litros = (Litros)GetProcAddress(hDLL, "Litros");
//resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");

// Mostrar caracteres correctamente en pantalla y título de la ventana.
SetConsoleOutputCP(65001);
wchar_t titulo[128];
MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
SetConsoleTitle(titulo);

// Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
SMALL_RECT r = { 0, 0, 49, 35 }; // X = 49, Y = 9.
SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);

// Ocultar cursor.
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

// Posición del cursor.
gotoxy(3, 2);

// Mostrar textos en pantalla.
wcout << mensaje() << endl;
gotoxy(0, 4);
cout << "Introduce el radio en m.: ";
cin >> radio;
cout << "Introduce la altura en m. ";
cin >> altura;
cout << "Introduce altura del agua. Máximo es de " << altura << ":";
cin >> nivelAgua;
cout << "Introduces cantidad de tubos: ";
cin >> cantidadTubos;

// ########## Dibujo de la barra.
cout << "\n";
cout << ("0 %                     50 %                   100 %") << endl;
cout << ("┌────────────────────────┬───────────────────────┐") << endl;

// Mitad de la barra para que no sea muy grande en la pantalla.
resultadoPorcentaje = nivelAgua * (100 / altura);

if (mitadBarra > 50)
{
mitadBarra = 50;
}

// Rellenar la barra.
for (float i = 1; i <= mitadBarra; i++)
{
cout << ("█");
}

// Si llega a 100 se pone el # en rojo.

if (resultadoPorcentaje > 100)
{
cout << ("#");
}
//########## Fin dibujo de la barra.

// Pisición del texto a mostrar.
gotoxy(0, 11);

cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";


FreeLibrary(hDLL);

// Esperando pulsar Enter para salir.
cin.get();
return 0;
}



No se como se quita esos sobrantes textos que aparece al final, pero bueno, por fin ya se puede leer la dichoza dll.

Hay otra cosa que quiero hacer pero no me sale y hago esta pregunta.

Todos los cálculos matemáticos los quiero en la dll, como este de abajo, que al final tuve que ponerlo en la interfaz.
Código:
	// Mitad de la barra para que no sea muy grande en la pantalla.
resultadoPorcentaje = nivelAgua * (100 / altura);

¿Hay posibilidad de ponerlo en la dll o no?

Saludos.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #8 en: 7 Julio 2020, 14:48 pm »

Se puede (es algo elemental que ya te indique antes), tenes que profundizar en tus conocimientos de C++.

¿Cual es el objetivo de asignarle un valor a una variable local como es litros en esta funcion?

Código
  1. float __stdcall Litros(float litros, float volumen)
  2. {
  3.    return litros = volumen * 1000;
  4. }

En cuanto se termine de ejecutar la funcion esa variable esta fuera de su ambito. Derias leer sobre C++ o hacer algun curso.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Prueba leer la dll nativo con interfaz C++ nativo
« Respuesta #9 en: 7 Julio 2020, 15:02 pm »

Lo estoy haciendo. Lo que a veces me adelanto, ajjajaj.

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Backdoor nativo en SMF 2.0 « 1 2 3 4 »
Nivel Web
WHK 30 30,293 Último mensaje 8 Noviembre 2009, 23:03 pm
por Skeletron
Que es android nativo?
Programación General
LinkL 2 8,192 Último mensaje 19 Diciembre 2015, 10:38 am
por WhiteDeMoN
activar usb nativo del mcu sam3s2c
Programación C/C++
Camilo Silva 0 1,613 Último mensaje 4 Abril 2017, 16:53 pm
por Camilo Silva
Crear ejecutable nativo no .net en vb.net
.NET (C#, VB.NET, ASP)
Flamer 8 3,211 Último mensaje 8 Diciembre 2018, 18:18 pm
por FranFin
¿CMD, PowerShell, Python es capaz de leer un archivo.dll de C++ nativo?
Scripting
Meta 0 2,009 Último mensaje 20 Junio 2020, 02:41 am
por Meta
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines