Dev - C++ - Corregir errores de C++ nativo

 
Vista:
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 18/06/2020 12:19:20
Buenas:

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

Código C#:

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


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

Código C++ Win32:

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


¿Alguna idea?

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 18/06/2020 13:04:40
Igual acabas antes comprándote un programa de los que hay para pasar de c# a c++.

¿Ese documento es lo que escribiste después de hacer una dll con lo que te enseñé yo?

El código en c# lo único que hace es cargar una dll, llamar dos funciones de esa dll y sacar lo que devuelven por la consola. Traducir eso a c++ es cargar la dll, llamar las funciones y sacar lo que devuelvan.

Una dll se puede cargar de forma implícita y explícita. En c#, sin api de windows, se carga de forma implícita. En c++ se puede hacer de las dos formas. De forma explícita es cargar la dll, LoadLibrary, hallar la dirección de una función, GetProcAddress, y llamar la función.

La forma implícita es igual que usar una función de un lib o en otro cpp: defines la función con sus parámetros y resultado, la llamas en el código y el enlazador la busca y enlaza. Así que para llamar una función de una dll de forma implícita tienes que definir la función, incluyendo en qué archivo está contenida, y llamarla. Luego ya haces lo que quieras con el resultado. Y todo eso se hace con la sintaxis y funciones de c++, no las de c#, claro.

https://docs.microsoft.com/es-es/cpp/build/linking-an-executable-to-a-dll?view=vs-2019
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 18/06/2020 13:33:16
Buenas:

Sí, es la que me enseñaste hace más de un año en C#. Ahora quiero hacerlo que lo lea C++ nativo.

Intenté hacer algo, pero no me sale.

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

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 18/06/2020 14:22:55
extern "C" es para indicar que una función externa está en c dentro de un código en c++.

Para llamar una función de una dll hay que usar __declspec(dllimport)
__declspec(dllimport) int Suma(int a, int b);

Y tienes que añadir la dll a los import, junto con los libs

Yo siempre uso LoadLibrary para cargar funciones en dlls.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 18/06/2020 14:41:41
El código que hice arriba está mal hecho.

La dll está creada que se llama Super_DLL.dll. Esa dll la coloco al lado del ejecutable. La interfaz quiero hacerla con C++ nativo o Win32, que al ejecutarla me lea la dll.

Pongo este ejemplo, la interfaz está hecho en la consola de C#, la dll está al lado del ejecutable, al ejecutar la interfaz de C#, me lee la dll.

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

Al ejecutarlo, Me aparece esta pantalla que por fin leyó la dll.
captura-2140676

Con la misma dll, quiero hacer la misma interfaz, en vez de C#, quiero que me funcione en C++ nativo.

Me ha funcionado hasta con Visual Basic .net. Pongo el código de VB .net abajo. Funciona, me lee la dll creado en C++ nativo o win32.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

¿Por qué en C++ me tiene que dar problemas por todas partes?

Si es lo que dices, a pesar de probarlo, no me funciona.
Código C++ nativo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <windows.h>
 
//__declspec(dllimport) Mensaje();
__declspec(dllimport) int Suma(int a, int b);
 
int main()
{
    //std::cout << Mensaje();
    std::cout << Suma(1764, -764);
 
    // Esperando pulsar Enter para salir.
    std::cin.get();
    return 0;
}

Errores.
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido
Error LNK2019 símbolo externo "__declspec(dllimport) int __cdecl Suma(int,int)" (__imp_?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 LNK1120 1 externos sin resolver Consola_win32_cpp C:\Users\Meta\Documents\Visual Studio 2019\Projects\Super_DLL\Debug\Consola_win32_cpp.exe 1


;)

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 18/06/2020 15:04:28
En c++ te da muchos problemas porque c++, a diferencia de c# o visual basic.net, te da cuerda larguísima para hacer lo que quieras. El problema es que lo que suele hacer la gente con esa cuerda es ahorcarse.

Vale, casi lo tienes. Y no lo tienes del todo porque sólo has hecho la mitad de lo que te he dicho. Si te fijas, te da un error de linkado. O sea, el linkador no sabe dónde está la función suma. Te falta eso de "Y tienes que añadir la dll a los import, junto con los libs".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 18/06/2020 15:57:29
Pues estoy casi ahorcado con esa cuerda.

Uso Visual Studio Community 2019 por si eso te aclara algo.

Pues no se hasta donde llegar. Tanto royo para hacer lo mismo. ;)

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

Se me escapa algo, a lo mejor el lib que dices.

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.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 18/06/2020 17:43:41
Puedes hacer dos cosas: o no hacerme caso a mí, seguir paseando por el monte y seguir con problemas, o hacerme caso a mí, seguir paseando por el monte y solucionar tus problemas. Y hacerme caso a mí es la rehostia.

Uses el ide que uses necesitarás un linkador. Ahí tienes un ejemplo de línea de comandos para el linkador para un visual studio al generar un programa cualquiera.

/OUT:"C:\Users\Meta\Documents\x64\Debug\PeazoPrograma.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\Meta\Documents\Debug\PeazoPrograma.pdb" /DYNAMICBASE "Wtsapi32.lib" "Userenv.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "Winmm.lib" "crypt32.lib" "ws2_32.lib" "dnsapi.lib" "C:\Users\Meta\Documents\chilkat-9.5.0-x86_64-vc2019\libs\ChilkatDbg_x64.lib" "C:\Users\Meta\Documents\chilkat-9.5.0-x86_64-vc2019\libs\ChilkatRel_x64.lib" /DEBUG /MACHINE:X64 /INCREMENTAL /PGD:"C:\Users\Meta\Documents\x64\Debug\PeazoPrograma.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\PreazoPrograma.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1

¿Ves todos los libs que hay? Pues ahí es donde busca las funciones externas que tiene que enlazar para poder generar un exe. Si tu dll no está ahí va a ser que nunca va a funcionar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 19/06/2020 01:39:18
No es que te haga caso, es que no comprendo.

Solo quiero que la dll ya creado, lo lea una interfaz también hecha en C++ nativo. La dll la pueda distribuir por ahí, y la persona que cree su propia interfaz y lea la dll.

Con C#, VB .net no me da tanto quebraderos de cabeza por esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 19/06/2020 09:44:44
Si no tienes que comprenderme, tienes que buscar en el google "visual studio añadir lib linkador" y en el primer enlace que te sale casi al principio de la página pone:

Para agregar archivos .lib como entrada del vinculador en el entorno de desarrollo

1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener más información, consulte propiedades de compilación y el compilador de C++ establece en Visual Studio.

2. Elija la entrada página de propiedades de la vinculador carpeta.

3. Modificar el dependencias adicionales propiedad va a agregar los archivos .lib.

La traducción es como para asesinar a alguien sin esperar al amanecer o dejar de engrasar la máquina que traduce pero se entiende.

El problema es que con c++ hay que seber programar. Con c# o vb.net vale con saber mover el ratón por la pantalla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 19/06/2020 22:44:56
Hola:

Por lo que he entendido, lo explico en un pdf que puedes ver y me cuenta si se me escapa algo.

Ver tutorial.

Si hay algo mal hecho, avisa.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 20/06/2020 16:48:44
Si usas __declspec(dllexport) ya no necesitas usar el archivo def, y si haces la dll en c no tienes que poner extern c.

Falta la parte de usar la dll en c++.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 21/06/2020 16:04:39
Todavía no he conseguido la solución.

Me dice:
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

https://docs.microsoft.com/es-es/cpp/error-messages/tool-errors/linker-tools-error-lnk1104?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev16.query%3FappId%3DDev16IDEF1%26l%3DES-ES%26k%3Dk(LNK1104)%26rd%3Dtrue&view=vs-2019

¿Tengo que poner en algún lado el archivo super_dll.lib?

Lo he puesto hasta aquí.
0001-2141944

Indicado en el primer código.

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

¿Se me escapa algo?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 22/06/2020 09:08:02
Si no encuentra la dll es porque no está la ruta completa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 01/07/2020 17:00:06
hola:

Encuentra la dll y el lib, pero me da problemas como en este caso.

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

Fallo que me dan en cada línea para leer la dll.
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?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 01/07/2020 17:30:39
Pues no sé si encuentra la dll. Lo que sí sé es que no busca las funciones en una dll.

extern es para indicarle al compilador que esas funciones no están en el archivo cpp que está compilando, que no van a estar en el obj que va a generar, sino en otro. Tú compilas un programa gordo, con muchos archivos cpp, y para decirle que una función o variable no está en un cpp sino en otro, le pones extern. Luego el linkador busca entre todos los objs a ver dónde está eso que aparece como extern, y si no lo encuentra da error. Eso es lo que te dice, que ni suma ni Mensaje lo encuentra en ningún obj.

Si esa función va a estar en una dll hay que poner __declspec(dllimport). Entonces no los busca en los objs que va a generar al compilar todos los cpp, sino que lo busca en las libs o dlls que aparecen en la línea de comando del lincador como dependencias externas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 02/07/2020 00:53:26
Hola:

Enel archivo llamado Super_dll.cpp lo sustituó del dllexport por dllimport. Sale estos mensajes.

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

Los errores son el mismo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 02/07/2020 13:02:44
No vamos a acabar.

En la dll hay que decirle qué funciones se van a exportar. Qué funciones se van a exportar en una dll se dice con el archivo def o con el dllexport en el fuente. En la dll, __dllexport.

Si vas a usar esas funciones en un programa, en ese programa hay que decirle que esas fuentes no están en ningún cpp del proyecto, sino que están en una librería aparte, y eso se le dice con el __dllimport, no con extern. En el código que llama a la dll, __dllimport.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 02/07/2020 16:06:13
¿Puedes poner un ejemplo de código?

Si hace falta enviarte el proyecto por email, lo hago.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 03/07/2020 10:39:02
Ya sé por qué nunca uso las llamadas implícitas a funciones de una dll: un rollo del copón. Donde estar llamarla explícitamente....

Dll
1
2
3
4
5
6
7
#include "pch.h"
 
// Suma.
int __stdcall Suma(int a, int b) { return a + b; }
 
// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll."); }

Archivo def
EXPORTS
Suma
Mensaje

Usar el __dllexports tiene la desventaja de que te cambia (colorea dicen algunos) el nombre de las funciones. Con __dllexports la función suma habría que cargarla suma= (Suma)GetProcAddress(hDLL, "_Suma@8");

Exe que usa la dll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <windows.h>
 
typedef  int(__stdcall* Suma)(int, int);
typedef LPTSTR(__stdcall* Mensaje)();
 
int main()
{
    HINSTANCE hDLL=0;
    Suma suma;
    Mensaje mensaje;
 
    hDLL = LoadLibrary(L[Ruta y nombre de la dll]);
    suma = (Suma)GetProcAddress(hDLL, "Suma");
    mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
    std::wcout << mensaje();
    std::cout << suma(1764, -764);
    FreeLibrary(hDLL);
 
    // Esperando pulsar Enter para salir.
    std::cin.get();
 
    return 0;
}

Todo eso en unicode.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 03/07/2020 15:29:16
Holas:

Noticias medias buenas.

Me sale la lectura desde C++ nativo esto. La buena noticia que es lee la dll. La no tanbuena es que solo muestra números en vez de texto.
1
2
00007FFD54CA9880
1000

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

En C# si lo lee.
1
2
Console.WriteLine(Marshal.PtrToStringAuto(Mensaje()));
            Console.WriteLine(Suma(1764, -764));

Si incluyes el Marshal, se lee bien los textos, no se ponen los textos en números.

Al menos ya lee la dll, algo es algo.

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

Poco a poco va avanzando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 03/07/2020 15:49:59
Al final he puesto que es unicode. cout no sabe qué hacer con un texto unicode, hay que usar wcout.

La clase Marshal de c# no puede usarse así en c++, claro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Corregir errores de C++ nativo

Publicado por Meta (45 intervenciones) el 03/07/2020 16:10:41
Me despiesté.

Por fin funciona todo. Muchas gracias.

En cuanto a esta parte del código, quiero añadirle un comentario.
1
2
3
HINSTANCE hDLL = 0;
	Suma suma;
	Mensaje mensaje;

¿Qué le pondría?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Corregir errores de C++ nativo

Publicado por Nacho (181 intervenciones) el 03/07/2020 16:27:06
HINSTANCE hDLL = 0; // handle de la dll cargada
Suma suma; // Suma está declarado en el typedef como un puntero a una función. suma es una variable para guardar ese puntero.
Mensaje mensaje; // Lo mismo que Suma.

¿Es para un trabajo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar