Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#161
Buenas:

Tengo un proyecto en el cual creé una dll, solo se actualiza una vez y está en esta dirección.
C:\Users\Meta\Documents\Visual Studio 2019\Projects\MyDLL\Debug\MyDLL.dll.

Lo curioso que cambié el texto de la dll para que me diga otra cosa, y la dirección de arriba no se actualiza pero es la dll que funciona. Se actualiza otra copia en otro directorio indicado abajo.
C:\Users\Meta\Documents\Visual Studio 2019\Projects\MyDLL\x64\Debug\MyDLL.dll.

Si uso esta dll llevándolo a la interfaz creada en la consola de C#, no funciona, me da este error.
CitarSystem.BadImageFormatException: 'Se ha intentado cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)'

Da igual que haga volver a compilar la dll, recopilar, limpiar  copilar de nuevo, nunca actualiza la dll que si funciona.

Dejo un tutorial en pdf de los pasos que he hecho para que entiendan lo que estoy diciendo, más bien, escribiendo.
Ver turorial en pdf.

Muchas gracias.
#162
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 (cpp) [Seleccionar]
#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;
}


CitarMe 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
#163
A ver si me sale como en el truco de importal la dll externa que está al lado del ejecutable.

Código (cpp) [Seleccionar]
#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;
}


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.
#164
Da problemas como puse arriba.

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

Código (cpp) [Seleccionar]
#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#.
Código (csharp) [Seleccionar]
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.
Código (cpp) [Seleccionar]
#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   


;)
#165
Por lo que te he entendido, parece que es algo así.

Código (cpp) [Seleccionar]
#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;
}
#166
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 (cpp) [Seleccionar]
extern "C"
{
int WINAPI Suma(int a, int b);
LPTSTR WINAPI Mensaje();
};


¿Y en el archivo Consola_win32_cpp.cpp este otro?
Código (cpp) [Seleccionar]
#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;
}


No me sale.

Y sin cabecera lo he intentado hacerlo así:
Código (cpp) [Seleccionar]
#include <iostream>
#include <windows.h>

int main()
{
   std::cout << Marshal->PtrToStringAuto(C->Mensaje());
   std::cout << C->Suma(1764, -764)->ToString();

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

extern "C"
{
   int WINAPI Suma(int a, int b);
   LPTSTR WINAPI Mensaje();
};


Tampoco funciona.
#167
Buenas:

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

Código C#:

Código (csharp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
#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.
#168
Scripting / Re: Probando este código
17 Junio 2020, 21:17 PM
Lo he instalado ahora y lo he cambiado.



Me sale con otro error.

CitarCan't find a usable init.tcl in the following directories:
    C:/Python27/lib/tcl8.5 {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/Python_consola_01/env1/lib/tcl8.5} {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/Python_consola_01/lib/tcl8.5} {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/Python_consola_01/env1/library} {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/Python_consola_01/library} {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/Python_consola_01/tcl8.5.15/library} {C:/Users/Meta/Documents/Visual Studio 2019/Projects/Python_consola_01/tcl8.5.15/library}



This probably means that Tcl wasn't installed properly.

Precisamente en la primera línea.

root = Tkinter.Tk()
#169
Editado el primer post, que me olvidé de poner el código completo.
#170
Buenas gente del foro:

Teniendo este programa, no se comporta como quiero. Se trata de usar solo las teclas flechas y la tecla Enter. Con ello se puede crear un nombre, escribir un nombre que quiera. Cuando ya termine, pulso Enter y se posiciona en la parte indicada en la imagen de abajo.

Aquí abajo, escribí todo a AAAAAAAAAAAAA.

Al pulsar Enter, tiene que ser capaz de señalar con las teclas flechas izquiera y derecha para poder elegir ATRÁS o GUARDAR.


Una vez que haya elegido con el símbolo en > ATRÁS, si pulsa Enter muestra un mensaje:
Código (csharp) [Seleccionar]
Console.Write("HAS PULSADO ATRÁS   ");

El programa en esta parte se acaba ahí.

Si con las flechas del teclado selecciona en > GUARDAR, luego pulsa la tecla Enter. A parte que el nombre como en este caso AAAAAAAAAAA, se almacena en la variable...
Código (csharp) [Seleccionar]
static string guardarNombre = "";

Muestra el mensaje: HAS GUARDADO y el nombre AAAAAAAAAAAAAAAA en pantalla.

Código completo en C#:
Código (csharp) [Seleccionar]
using System;

namespace LCD_nombre_archivo_consola_06
{
    class Program
    {
        static string guardarNombre = "";
        static int coordenadaX = 0;
        static ConsoleKey key;

        static readonly char[] roALFANUMERICO = new char[] {
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
            'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
            'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
            'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
            '¿', '?', '(', ')', '[', ']', '{', '}','=', '$','&', '"', ' '};

        static readonly int[] roINDICE_ARRAY = new int[] {
            80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80 };

        private static readonly string[] roTEXTO = new string[] { "ATRÁS", "GUARDAR" };

        static int index = 0;
        static void Main(string[] args)
        {
            // Título de la pantalla.
            Console.Title = "Cambiar nombre";

            Inicio();
        }

        #region Inico.
        private static void Inicio()
        {
            // Tamaño de la ventana.
            Console.SetWindowSize(20, 5);

            // Fondo verde.
            Console.BackgroundColor = ConsoleColor.Blue;

            // Letras negras.
            Console.ForegroundColor = ConsoleColor.White;

            // Limpiar pantalla.
            Console.Clear();

            Console.SetCursorPosition(0, 0);
            Console.Write("Nombre del relé 1:  ");
            Console.SetCursorPosition(0, 1);
            //Console.Write("AAAAAAAAAAAAAAAA");

            // Recorre todo el índice del array y el de los datos alfanumérico.
            for (int i = 0; i < roINDICE_ARRAY.Length; i++)
            {
                Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
            }

            Console.SetCursorPosition(2, 3);
            Console.Write(roTEXTO[0]); // ATRÁS.
            Console.SetCursorPosition(12, 3);
            Console.Write(roTEXTO[1]); // GUARDAR.

            while (true)
            {
                Console.SetCursorPosition(coordenadaX, 1);
                key = Console.ReadKey(true).Key;
                switch (key)
                {
                    case ConsoleKey.RightArrow:
                        if (coordenadaX < 15)
                            coordenadaX++;
                        break;

                    case ConsoleKey.LeftArrow:
                        if (coordenadaX > 0)
                            coordenadaX--;
                        break;

                    case ConsoleKey.UpArrow:
                        roINDICE_ARRAY[coordenadaX]++;
                        if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
                        {
                            roINDICE_ARRAY[coordenadaX] = 0;
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.DownArrow:
                        roINDICE_ARRAY[coordenadaX]--;
                        if (roINDICE_ARRAY[coordenadaX] < 0)
                        {
                            roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
                        }
                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
                        break;

                    case ConsoleKey.Enter:
                        Console.SetCursorPosition(1, 3);
                        Console.Write(">");
 
                        while (true)
                        {
                            key = Console.ReadKey(true).Key;

                            switch (key)
                            {
                                case ConsoleKey.RightArrow:
                                case ConsoleKey.LeftArrow:
                                    index = 1 - index;
                                    break;

                                case ConsoleKey.UpArrow:
                                case ConsoleKey.DownArrow:
                                    Console.SetCursorPosition(coordenadaX, 1);
                                    break;

                                case ConsoleKey.Enter:

                                    break;
                            }

                            for (int a = 0; a < 2; a++)
                            {
                                Console.SetCursorPosition(1 + (10 * a), 3);
                                if (a == index)
                                    Console.Write(">");
                                else
                                    Console.Write(" ");
                            }

                            if (index == 0)  // se pulsó Atrás
                            {
                                Atras();
                                //break;  // vuelve a la edición de letras
                            }
                           
                            if (index == 1)  // se pulsó Guardar
                            {
                                Guardar();
                            }
                        }
                }
            }
        }
        #endregion

        private static void Atras()
        {
            Console.Clear();
            Console.SetCursorPosition(0, 1);
            Console.Write("HAS PULSADO ATRÁS   ");
            Console.ReadKey(); // Pulse cualquier tecla para salir.
        }

        private static void Guardar()
        {
            Console.Clear();
            Console.SetCursorPosition(0, 1);
            Console.Write("HAS GUARDADO       ");
            for (int a = 0; a < roINDICE_ARRAY.Length; a++)
            {
                guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
            }
            Console.SetCursorPosition(0, 2);
            Console.Write(guardarNombre);
        }
    }
}


¿Alguna idea?

Un saludo.