Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Meta en 18 Junio 2020, 10:27 am



Título: Leer dll en consola win32
Publicado por: Meta en 18 Junio 2020, 10:27 am
Buenas:

Tengo un ejemplo en C# para leer una dll hecho en C++ Win32.

Código C#:

Código
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace Consola_cs
  5. {
  6.    class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            Console.WriteLine(Marshal.PtrToStringAuto(SUPER_DLL.Mensaje()));
  11.            Console.WriteLine(SUPER_DLL.Suma(1764, -764).ToString());
  12.  
  13.            // Pulse cualquier tecla para salir.
  14.            Console.ReadKey();
  15.        }
  16.        internal class SUPER_DLL
  17.        {
  18.            [DllImport("Super_dll.dll")]
  19.            extern static public int Suma(int a, int b);
  20.            [DllImport("Super_dll.dll")]
  21.            extern static public IntPtr Mensaje();
  22.        }
  23.    }
  24. }


Quiero adaptarlo la consola en Win32, pero me da errores.

Código C++ Win32:

Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. int main()
  5. {
  6.    std::cout << Marshal.PtrToStringAuto(SUPER_DLL.Mensaje());
  7.    std::cout << SUPER_DLL.Suma(1764, -764).ToString();
  8.  
  9.    // Esperando pulsar Enter para salir.
  10.    std::cin.get();
  11.    return 0;
  12. }
  13.  
  14. internal class SUPER_DLL
  15. {
  16.    [DllImport("Super_dll.dll")]
  17.    extern static public int Suma(int a, int b);
  18.    [DllImport("Super_dll.dll")]
  19.    extern static public IntPtr Mensaje();
  20. }
  21.  
Documento de aquí (https://es.slideshare.net/Metaconta/crear-una-dll-en-c-y-llamarla-con-la-interfaz-c).


¿Alguna idea?

Saludos.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 18 Junio 2020, 12:21 pm
Deberias crear un .h con las funciones. Hay dos formas de llamar a esas funciones de la DLL, enlazando estatica y dinamicamente.

En la primera usas el .lib generado por el proyecto de la DLL al enlazar el ejecutable.

Código
  1. extern "C"
  2. {
  3. int WINAPI Suma(int a, int b);
  4. LPTSTR WINAPI Mensaje();
  5. };
  6. ...
  7. std::cout << Suma(5, 4);
  8.  


En la segunda usas LoadLibrary y GetProcAddress (no hay comprobacion de errores, LoadLibrary puede retornar un error y GetProcAddress un puntero nulo por ejemplo).

Código
  1. typedef LPTSTR (WINAPI *Mensaje_ptr)();
  2. HMODULE sdll = LoadLibrary("Super_dll.dll");
  3. Mensaje_ptr Mensaje = (Mensaje_ptr)GetProcAddress(sdll, "Mensaje");
  4. std::cout << Mensaje();

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.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 18 Junio 2020, 12:52 pm
Sigo pescando...

Parece ser que la primera opción es más cómodo por decirlo de alguna manera.

¿Este código de abajo lo pongo en un archivo en cabecera llamado Consola_win32_cpp.h?

Código
  1. extern "C"
  2. {
  3. int WINAPI Suma(int a, int b);
  4. LPTSTR WINAPI Mensaje();
  5. };

¿Y en el archivo Consola_win32_cpp.cpp este otro?
Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. int main()
  5. {
  6.    std::cout << Marshal.PtrToStringAuto(SUPER_DLL.Mensaje());
  7.    std::cout << SUPER_DLL.Suma(1764, -764).ToString();
  8.  
  9.    // Esperando pulsar Enter para salir.
  10.    std::cin.get();
  11.    return 0;
  12. }

No me sale.

Y sin cabecera lo he intentado hacerlo así:
Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. int main()
  5. {
  6.    std::cout << Marshal->PtrToStringAuto(C->Mensaje());
  7.    std::cout << C->Suma(1764, -764)->ToString();
  8.  
  9.    // Esperando pulsar Enter para salir.
  10.    std::cin.get();
  11.    return 0;
  12. }
  13.  
  14. extern "C"
  15. {
  16.    int WINAPI Suma(int a, int b);
  17.    LPTSTR WINAPI Mensaje();
  18. };

Tampoco funciona.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 18 Junio 2020, 12:59 pm
No estas haciendo ningun #include de tu nuevo .h asi que obviamente no lo va a incluir en el codigo. En el ultimo caso lo estas definiendo DESPUES de usarlo, eso tampoco funcionara.

Y presta atencion, Marshal no es nada y SUPER_DLL tampoco, ToString no existe ni PtrToStringAuto. Lee los errores para remediarlos y mira los ejemplos de como llamar a las funciones que deje antes.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 18 Junio 2020, 13:29 pm
Por lo que te he entendido, parece que es algo así.

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


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 18 Junio 2020, 13:55 pm
Si, eso compila y se enlazara con Super_dll.lib correctamente.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 18 Junio 2020, 14:23 pm
Da problemas como puse arriba.

Lo que quiero, para dejarlo más claro. Creé una dll de C++ nativo o win32.

Código
  1. #include "pch.h"
  2. #include "Super_dll.h"
  3.  
  4. extern "C" {
  5. __declspec(dllexport) int WINAPI Suma(int, int);
  6. __declspec(dllexport) LPTSTR WINAPI Mensaje();
  7. };
  8.  
  9. // Suma.
  10. int WINAPI Suma(int a, int b) { return a + b; }
  11.  
  12. // Mensaje.
  13. LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32 escrito en C++."); }

Físicamente el archivo se llama Super_dll.dll.

En el mismo proyecto creo otro como es en este caso en C#.
Código
  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace Consola_02_cs
  5. {
  6.    class Program
  7.    {
  8.        // Importar dll.
  9.        [DllImport("Super_dll.dll")]
  10.        extern static public int Suma(int a, int b);
  11.        [DllImport("Super_dll.dll")]
  12.        extern static public IntPtr Mensaje();
  13.  
  14.        static void Main()
  15.        {
  16.            // T&#237;tulo de la ventana.
  17.            Console.Title = "Consola C# 2019";
  18.  
  19.            // Tama&#241;o de la ventana.
  20.            Console.SetWindowSize(40, 5);
  21.  
  22.            // Color de las letras.
  23.            Console.ForegroundColor = ConsoleColor.Green;
  24.  
  25.            Console.WriteLine(Marshal.PtrToStringAuto(Mensaje()));
  26.            Console.WriteLine(Suma(1764, -764).ToString());
  27.  
  28.            // Pulse cualquier tecla para salir.
  29.            Console.ReadKey();
  30.        }
  31.    }
  32. }

Me lee la dll como muestra abajo de ejemplo.
(https://www.subeimagenes.com/img/captura-2140676.PNG)

La interfaz hecho con la consola de C# ha leído la dll hecho con C++ nativo o win32.

Quiero hacer exactamente lo mismo, la dll es la misma, y está el archivo Super_dll.dll al lado del ejecutable. En este caso, la interfaz en vez de ser en C#, lo quiero hacer en consola en C++ nativo o win32.

Hice pruebas hasta con VB .net de la interfaz leyendo la dll y funciona.
Código:
Imports System.Runtime.InteropServices
Module Module1

    Sub Main()
        ' Título de la ventgana.
        Console.Title = "Consola VB 2019"

        ' Tamaño de la ventana.
        Console.SetWindowSize(40, 5)

        ' Color de las letras.
        Console.ForegroundColor = ConsoleColor.Cyan

        Console.WriteLine(Marshal.PtrToStringAuto(SUPER_DLL.Mensaje()))
        Console.WriteLine(SUPER_DLL.Suma(1764, -764).ToString())

        ' Pulse cualquier tecla para salir.
        Console.ReadKey()
    End Sub

    Friend Class SUPER_DLL
        <DllImport("Super_dll.dll")>
        Public Shared Function Suma(ByVal a As Integer, ByVal b As Integer) As Integer

        End Function
        <DllImport("Super_dll.dll")>
        Public Shared Function Mensaje() As IntPtr

        End Function
    End Class

End Module

La interfaz en C++ se me resiste tal como la quiero.

Lo curioso, haciendo pruebas con la interfaz en C++ del CLR o .net, también me da quebraderos de cabeza.
Código
  1. #include "pch.h"
  2.  
  3. using namespace System;
  4.  
  5.    [DllImport("Super_dll.dll")]
  6.    extern int Suma(int a, int b);
  7.    [DllImport("Super_dll.dll")]
  8.    extern IntPtr Mensaje();
  9.  
  10.  
  11. int main(array<System::String ^> ^args)
  12. {
  13.    // T&#237;tulo de la ventana.
  14.    Console::Title = "Consola C++ CLR 2019";
  15.  
  16.    // Tama&#241;o de la ventana.
  17.    Console::SetWindowSize(40, 5);
  18.  
  19.    // Color de las letras.
  20.    Console::ForegroundColor = ConsoleColor::Yellow;
  21.  
  22.    Console::WriteLine(Mensaje());
  23.    Console::WriteLine(Suma(1764, -764).ToString());
  24.  
  25.    // Pulse cualquier tecla para salir.
  26.    Console::ReadKey();
  27.    return 0;
  28. }
  29.  

Errores.
Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   C2337   'DllImport': no se encontró el atributo   Consola_clr_cpp   C:\Users\Usuario\Documents\Visual Studio 2019\Projects\Super_DLL\Consola_clr_cpp\Consola_clr_cpp.cpp   7   


;)


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 18 Junio 2020, 15:33 pm
Da problemas como puse arriba.

Estas haciendo algo mal (desde la primera vez que te respondi que lo tengo funcionando).

En lugar de poner codigo de otros lenguajes pone solamente el codigo de C++ que estas usando ahora mismo y los errores que te da al generar el ejecutable (no sabemos si esta fallando al compilar o enlazar por ejemplo).


Título: Re: Leer dll en consola win32
Publicado por: Meta en 18 Junio 2020, 16:01 pm
A ver si me sale como en el truco de importal la dll externa que está al lado del ejecutable.

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

Voy a caminar un rato por el monte a despejarme la cabeza antes que me de un derrame cerebral o estrés post-traumático.

Por la noche vuelvo.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 18 Junio 2020, 16:11 pm
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.



Esto se puede generar en 2' usando el Visual Studio 20XX Developer Command Prompt y estos 2 archivos:

Super_dll.cpp:
Código
  1. //build con:: cl /Zi /LD Super_dll.cpp
  2. #include <windows.h>
  3.  
  4. extern "C"
  5. {
  6. __declspec(dllexport) int WINAPI Suma(int, int);
  7. __declspec(dllexport) LPTSTR WINAPI Mensaje();
  8. };
  9.  
  10. // Suma.
  11. int WINAPI Suma(int a, int b) { return a + b; }
  12. // Mensaje.
  13. LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32."); }
  14.  
  15.  
  16. BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
  17. {
  18. switch (ul_reason_for_call)
  19. {
  20. case DLL_PROCESS_ATTACH:
  21. case DLL_THREAD_ATTACH:
  22. case DLL_THREAD_DETACH:
  23. case DLL_PROCESS_DETACH:
  24. break;
  25. }
  26. return TRUE;
  27. }

consola.cpp:
Código
  1. //build con:: cl /Zi consola.cpp Super_dll.lib
  2. #include <iostream>
  3. #include <windows.h>
  4.  
  5. extern "C"
  6. {
  7. int WINAPI Suma(int a, int b);
  8. LPWSTR WINAPI Mensaje();
  9. };
  10.  
  11. int main()
  12. {
  13. std::wcout << Mensaje();
  14. std::cout << Suma(1764, -764);
  15.  
  16. // Esperando pulsar Enter para salir.
  17. std::cin.get();
  18. return 0;
  19. }


PD. Aca usaste la L asi que esto es wchar_t y no podes usar cout (ni LPTSTR sin configurar el programa como Unicode). LPTSTR WINAPI Mensaje() { return LPTSTR(L"Hola. Soy una DLL Win32 escrito en C++."); }


Título: Re: Leer dll en consola win32
Publicado por: Meta 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


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol 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.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 20 Junio 2020, 20:44 pm
Lo pongo aquí dentro del proyecto de la interfaz C++ nativo, no de la dll.

(https://www.subeimagenes.com/img/0007-2141572.PNG)

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.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 20 Junio 2020, 22:59 pm
Ahi mismo donde dice Directorios de VC++ (https://docs.microsoft.com/es-es/cpp/build/reference/vcpp-directories-property-page?view=vs-2019), 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.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 21 Junio 2020, 00:02 am
Parece que tiene que ser justo ahí.

(https://www.subeimagenes.com/img/0001-2141646.PNG)



Título: Re: Leer dll en consola win32
Publicado por: Meta 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.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol 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();


Título: Re: Leer dll en consola win32
Publicado por: Meta 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.



Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol 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.


Título: Re: Leer dll en consola win32
Publicado por: Meta 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.


Título: Re: Leer dll en consola win32
Publicado por: Eternal Idol en 3 Julio 2020, 17:05 pm
De nadas  ::)

PD. Mejor cargar (https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya) la DLL sin el path completo.


Título: Re: Leer dll en consola win32
Publicado por: Meta en 3 Julio 2020, 23:29 pm
Buenas:

Gracias por el consejo. Estoy ahora mismo haciendo la versión con dll. En cuanto lo tenga, lo muestro.

Les dejo un enlace del programa pero esta vez en la introducción de datos y cuando muestra los datos, se escucha una voz. El enlace es por Dropbox.

(https://www.subeimagenes.com/img/captura-2145377.PNG)

Enlace  (https://www.dropbox.com/s/gwfgfshi9ely3bl/Calculo_cilindro_voz_consola_02_cs.zip?dl=0)

Lo prueban y comentan si les funcionan, a parte de contar sus impresiones.