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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Leer dll en consola win32
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Leer dll en consola win32  (Leído 10,625 veces)
Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #10 en: 19 Junio 2020, 01:02 am »

Voy a probarlo. Lo hago por curiosidad tu propuesta y muchas gracias.

Mi idea es crear un archivo.dll independiente, distribuirlo y la gente lo use con su propia interfaz esta vez hecho en C+++ nativo.

;)

Edito:

Código
  1. #pragma comment( lib, "super_dll" )
  2. #include <iostream>
  3. #include <windows.h>
  4.  
  5. extern int WINAPI Suma(int, int);
  6. extern LPTSTR WINAPI Mensaje();
  7.  
  8. int main()
  9. {
  10.    std::cout << Mensaje();
  11.    std::cout << Suma(1764, -764);
  12.  
  13.    // Esperando pulsar Enter para salir.
  14.    std::cin.get();
  15.    return 0;
  16. }

Citar
Me sale este error.

Gravedad    Código    Descripción    Proyecto    Archivo    Línea    Estado suprimido
Error    LNK1104    no se puede abrir el archivo 'super_dll.lib'    Consola_win32_cpp    C:\Users\Meta\Documents\Visual Studio 2019\Projects\Super_DLL\Consola_win32_cpp\LINK    1


« Última modificación: 19 Junio 2020, 01:56 am por Meta » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


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


Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #11 en: 20 Junio 2020, 20:07 pm »

Error    LNK1104    no se puede abrir el archivo 'super_dll.lib'  .

Si tenes una solucion con ambos proyectos deberias poder hacerlos dependientes, de otra manera simplemente copia el archivo donde corresponda para que el enlazador lo encuentre.


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.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #12 en: 20 Junio 2020, 20:44 pm »

Lo pongo aquí dentro del proyecto de la interfaz C++ nativo, no de la dll.



Son dos proyectos en la misma solución. Una para dll de C++ nativo a 64 bits. Luego la consola tambiñen de C++ nativo.

Sigue con el mismo error.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


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


Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #13 en: 20 Junio 2020, 22:59 pm »

Ahi mismo donde dice Directorios de VC++, uno tiene que ser el de librerias, añadis ;$(SOLUTIONDIR)$(INTDIR) al final. Comproba que el valor evaluado sea el del directorio donde se genero el bendito super_dll.lib y de no serlo arreglalo.
« Última modificación: 20 Junio 2020, 23:02 pm por Eternal Idol » 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.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #14 en: 21 Junio 2020, 00:02 am »

Parece que tiene que ser justo ahí.



En línea

Meta


Desconectado Desconectado

Mensajes: 3.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #15 en: 2 Julio 2020, 01:10 am »

Teniendo el archivo este como siempre.

Código
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5. extern int WINAPI Suma(int, int);
  6. extern LPTSTR WINAPI Mensaje();
  7.  
  8. int main()
  9. {
  10.    // Mostrar texto desde la dll.
  11.    cout << Mensaje();
  12.  
  13.    // Mostrar esta suma desde la dll.
  14.    cout << Suma(1764, -764);
  15.  
  16.    // Esperando pulsar Enter para salir.
  17.    cin.get();
  18.    return 0;
  19. }

Me muestra los mensajes de estos errores.

Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error LNK2019 símbolo externo "int __cdecl Suma(int,int)" (?Suma@@YAHHH@Z) sin resolver al que se hace referencia en la función main Consola_win32_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\Super_DLL\Consola_win32_cpp\Consola_win32_cpp.obj 1




Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error LNK2019 símbolo externo "wchar_t * __cdecl Mensaje(void)" (?Mensaje@@YAPEA_WXZ) sin resolver al que se hace referencia en la función main Consola_win32_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\Super_DLL\Consola_win32_cpp\Consola_win32_cpp.obj 1

¿Alguna idea de qué está el IDE alegando?

Saludos.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


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


Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #16 en: 2 Julio 2020, 09:21 am »

¿¿Todavia con esto??  :huh:

Lo que habias puesto originalmente con dllimport - y lo ultimo tambien - fallara al enlazar, aun pasandole el Super_dll.lib, por usar en la DLL extern "C" y en el programa no.

Solucion:
Código
  1. extern "C" int WINAPI Suma(int a, int b);
  2. extern "C" LPWSTR WINAPI Mensaje();
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.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #17 en: 3 Julio 2020, 15:48 pm »

Hola:

Todavía con esto, la verdad es que si. Descansé un poco haciendo otros programas de cálculos de litros de un depósito en C#, ajajajjajajajajjaa, pero funciona. Siguiendo el tema. Voy a comentar poco a poco los pasos.

Creo la dll llamada Super_dll.dll. El archivo del código fuente es esto.

Super_dll.cpp:
Código
  1. #include "pch.h"
  2.  
  3. extern "C" {
  4.    __declspec(dllexport)  int WINAPI Suma(int, int);
  5.    __declspec(dllexport) LPTSTR WINAPI Mensaje();
  6. };
  7.  
  8. // Suma.
  9. //int WINAPI Suma(int a, int b) { return a + b; }
  10. int __stdcall Suma(int a, int b) { return a + b; }
  11.  
  12. // Mensaje.
  13. //LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll."); }
  14. LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll."); }

Consola_win32_cpp.cpp:
Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef  int(__stdcall* Suma)(int, int);
  7. typedef LPTSTR(__stdcall* Mensaje)();
  8.  
  9. int main()
  10. {
  11.    HINSTANCE hDLL = 0;
  12.    Suma suma;
  13.    Mensaje mensaje;
  14.  
  15.    hDLL = LoadLibrary(L"C:\\Users\\Usuario\\Documents\\Visual Studio 2019\\Projects\\Super_DLL\\x64\\Debug\\Super_dll.dll");
  16.    suma = (Suma)GetProcAddress(hDLL, "Suma");
  17.    mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
  18.  
  19.    cout << mensaje() << endl;
  20.    cout << suma(1764, -764) << endl;
  21.  
  22.    FreeLibrary(hDLL);
  23.  
  24.    // Esperando pulsar Enter para salir.
  25.    cin.get();
  26.    return 0;
  27. }

Super_dll.def:
Código:
LIBRARY Super_dll
EXPORTS
Suma
Mensaje

La buena noticia que por fin me lee la dll. La no tan buena, en vez de mostrar el texto desde la dll, se muestran números.
Código
  1. 00007FFD54CC9880
  2. 1000

Pensaba usar en Marshal.
Código
  1. cout << Marshal.PtrToStringAuto(mensaje()) << endl;

Se que si uso el Marshal, los números se verán el texto de la dll.

Ahora estoy chasmusqueándome las neuronas por esto. De alguna forma se tiene que poder. Al menos el paso que hemos dado, es que lea la dll. Todavía necesito ayuda.

Gracias por todo.

« Última modificación: 3 Julio 2020, 16:21 pm por Meta » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


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


Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #18 en: 3 Julio 2020, 16:01 pm »

Ya estaba respondido tambien:
PD. Si usas LPTSTR tenes que hacer coincidir ANSI/Unicode en ambos proyectos y si usaste Unicode usar std::wcout. Microsoft suele usar funciones terminadas en A y W para estos casos.

Código
  1. wcout << mensaje() << endl;

Insistir con el Marshal en C++ es futil, como ya te dije, no existe.

PD. Este es el subforo de C++, no pongas mas codigo de C# u otros lenguajes, lo unico que logras es distraer y exasperar.
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.499



Ver Perfil WWW
Re: Leer dll en consola win32
« Respuesta #19 en: 3 Julio 2020, 16:20 pm »

Cierto, me despisté.

Código
  1. wcout << mensaje() << endl;

Ahora sí que me lee hasta el alma. Por fin funciona. Muchísimas gracias mi muy distinguido amigo.

Añadido abajo un ejemplo de poner un título, tamaño de la ventana, posición del cursor, corrección textos con tildes...

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  int(__stdcall* Suma)(int, int);
  21. typedef LPTSTR(__stdcall* Mensaje)();
  22.  
  23. int main(void)
  24. {
  25. // Importar dll.
  26. HINSTANCE hDLL = 0;
  27. Suma suma;
  28. Mensaje mensaje;
  29.  
  30. hDLL = LoadLibrary(L"C:\\Users\\Usuario\\Documents\\Visual Studio 2019\\Projects\\Super_DLL\\x64\\Debug\\Super_dll.dll");
  31. suma = (Suma)GetProcAddress(hDLL, "Suma");
  32. mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
  33.  
  34. // Mostrar caracteres correctamente en pantalla y título de la ventana.
  35. SetConsoleOutputCP(65001);
  36. wchar_t titulo[128];
  37. MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
  38. SetConsoleTitle(titulo);
  39.  
  40. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  41. SMALL_RECT r = { 0, 0, 49, 9 }; // X = 49, Y = 9.
  42. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  43.  
  44. // Ocultar cursor.
  45. CONSOLE_CURSOR_INFO cci;
  46. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  47. cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
  48. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  49.  
  50. // Posición del cursor.
  51. gotoxy(10, 3);
  52.  
  53. // Mostrar textos en pantalla.
  54. wcout << mensaje() << endl;
  55. cout << suma(1764, -764) << endl;
  56.  
  57. FreeLibrary(hDLL);
  58.  
  59. // Esperando pulsar Enter para salir.
  60. cin.get();
  61. return 0;
  62. }

Gracias por todo.
 ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)

PD: Código de C# arriba quitado.
« Última modificación: 3 Julio 2020, 16:22 pm por Meta » En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
llamar desde una aplicación de consola una ventana win32 (del mismo proyecto)
Programación C/C++
while 0 2,126 Último mensaje 13 Octubre 2010, 13:21 pm
por while
Ayuda win32.beginupdateresource(), win32.updateresource(), no funciona.
.NET (C#, VB.NET, ASP)
krosty123 2 3,863 Último mensaje 6 Noviembre 2010, 04:10 am
por krosty123
Leer recursos desde consola. codedom (EmbeddedResources.Add)
.NET (C#, VB.NET, ASP)
70N1 1 2,133 Último mensaje 20 Octubre 2011, 14:21 pm
por 70N1
leer de consola
Programación C/C++
farlaine23 1 2,003 Último mensaje 28 Noviembre 2011, 19:55 pm
por Littlehorse
[Aporte] Java-Leer cantidades (consola)
Java
Senior++ 2 2,881 Último mensaje 16 Julio 2012, 06:26 am
por hucruz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines