| |
|
371
|
Programación / Programación C/C++ / Re: Leer dll en consola win32
|
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. #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 
|
|
|
|
|
372
|
Programación / Programación C/C++ / Re: Leer dll en consola win32
|
en: 18 Junio 2020, 13:29 pm
|
Por lo que te he entendido, parece que es algo así. #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; }
|
|
|
|
|
373
|
Programación / Programación C/C++ / Re: Leer dll en consola win32
|
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? extern "C" { int WINAPI Suma(int a, int b); LPTSTR WINAPI Mensaje(); };
¿Y en el archivo Consola_win32_cpp.cpp este otro? #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í: #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.
|
|
|
|
|
374
|
Programación / Programación C/C++ / Leer dll en consola win32
|
en: 18 Junio 2020, 10:27 am
|
Buenas: Tengo un ejemplo en C# para leer una dll hecho en C++ Win32. Código C#: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:#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.
|
|
|
|
|
375
|
Programación / Scripting / Re: Probando este código
|
en: 17 Junio 2020, 21:17 pm
|
Lo he instalado ahora y lo he cambiado.  Me sale con otro error. Can'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()
|
|
|
|
|
377
|
Programación / .NET (C#, VB.NET, ASP) / Corregir este programa
|
en: 17 Junio 2020, 16:43 pm
|
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: 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... static string guardarNombre = "";
Muestra el mensaje: HAS GUARDADO y el nombre AAAAAAAAAAAAAAAA en pantalla. Código completo en C#: 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.
|
|
|
|
|
378
|
Programación / Scripting / Probando este código
|
en: 17 Junio 2020, 15:55 pm
|
Buenas: Tengo este código de Python 2.x. No me funciona en Visual Studio Community 2019 (Gratuito). import os, sys, tkFileDialog,Tkinter root = Tkinter.Tk() root.withdraw() formats = [ ('Roms Super Nintendo SMC','.smc'),('Roms Super Nintendo SFC','.sfc'),('Fichier Bin','.bin'),('Roms Super Nintendo','.smc .sfc .bin') ] input = tkFileDialog.askopenfile(parent=root,mode='rb',filetypes=formats,title='Select file to swap bin HI to LO like A16->A15, A17->A16...A21->A20 and A15->21') if not input: print "Error: Cannot open file" sys.exit() output = tkFileDialog.asksaveasfile(parent=root,mode='wb',filetypes=formats,title='Create output file name') if not output: print "Error: cannot create output file" sys.exit() # reading input file to a byte array data = bytearray(input.read()) # calculating rom size in 2 exponants expsize = 0 bytesize = len(data) while bytesize > 1: expsize += 1 bytesize = bytesize // 2 # init a proper size empty bytearray buffer = bytearray() for i in range(2**expsize): buffer.append(0) # let's do the swap count = 0 for i in range(len(data)): addr = (i & 0x7fff) + ((i & 0x008000) << (expsize - 16)) + ((i & 0x010000) >> 1) + ((i & 0x020000) >> 1) + ((i & 0x040000) >> 1) + ((i & 0x080000) >> 1) + ((i & 0x100000) >> 1) + ((i & 0x200000) >> 1) if addr != i: count += 1 buffer[addr] = data[i] print "Swapped %s (%s) addresses" % (count, hex(count)) # writing output file output.write(buffer) # close file handles input.close() output.close()
Me sale estos errores. Traceback (most recent call last): File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "c:\program files (x86)\microsoft visual studio\2019\community\common7\ide\extensions\microsoft\python\core\debugpy\__main__.py", line 45, in <module> cli.main() File "c:\program files (x86)\microsoft visual studio\2019\community\common7\ide\extensions\microsoft\python\core\debugpy/..\debugpy\server\cli.py", line 429, in main run() File "c:\program files (x86)\microsoft visual studio\2019\community\common7\ide\extensions\microsoft\python\core\debugpy/..\debugpy\server\cli.py", line 266, in run_file runpy.run_path(options.target, run_name=compat.force_str("__main__")) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\runpy.py", line 261, in run_path code, fname = _get_code_from_file(run_name, path_name) File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\runpy.py", line 236, in _get_code_from_file code = compile(f.read(), fname, 'exec') File "C:\Users\Meta\Documents\Visual Studio 2019\Python_consola_01\Python_consola_01\Python_consola_01.py", line 10 print "Error: Cannot open file" ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Error: Cannot open file")? Press any key to continue . . . ¿Les dicen algo? Saludos.
|
|
|
|
|
380
|
Programación / Programación C/C++ / Capturar tecla
|
en: 16 Junio 2020, 13:49 pm
|
Buenas: En C++ CLR para almacenar en una variable cualquier tecla pulsada de hace así indicado abajo. // Almacena la tecla pulsada en la variable. ConsoleKey teclaInicial; ¿Cómo se hace en C++ Win32? Saludos.
|
|
|
|
|
|
| |
|