Da problemas como puse arriba.
Lo que quiero, para dejarlo más claro. Creé una dll de C++ nativo o win32.
#include "pch.h"
#include "Super_dll.h"
extern "C" {
__declspec(dllexport) int WINAPI Suma(int, int);
__declspec(dllexport) LPTSTR WINAPI Mensaje();
};
// Suma.
int WINAPI Suma(int a, int b) { return a + b; }
// Mensaje.
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#.
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ítulo de la ventana.
Console.Title = "Consola C# 2019";
// Tamañ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();
}
}
}
Me lee la dll como muestra abajo de ejemplo.
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.
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.
#include "pch.h"
using namespace System;
[DllImport("Super_dll.dll")]
extern int Suma(int a, int b);
[DllImport("Super_dll.dll")]
extern IntPtr Mensaje();
int main(array<System::String ^> ^args)
{
// Título de la ventana.
Console::Title = "Consola C++ CLR 2019";
// Tamaño de la ventana.
Console::SetWindowSize(40, 5);
// Color de las letras.
Console::ForegroundColor = ConsoleColor::Yellow;
Console::WriteLine(Mensaje());
Console::WriteLine(Suma(1764, -764).ToString());
// Pulse cualquier tecla para salir.
Console::ReadKey();
return 0;
}
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