elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Adaptar C++ CLR a C++ Win32
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Adaptar C++ CLR a C++ Win32  (Leído 4,001 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Adaptar C++ CLR a C++ Win32
« en: 16 Noviembre 2017, 12:15 pm »

Hola:

Quiero adaptar este código de C++ CLR a C++ Win32. Antes que nada, quiero saber si es posible o hay que complicarse mucho la vida para hacer lo mismo. El código lo que hace es abrir y cerrar la bandeja de cualquier lector de discos sea IDE o SATA.

Aquí encontré un vídeo pero solo ejecuta, y abre el lector en Win32. Por algo se empieza.



Código C++ CLR:
Código
  1. #include "stdafx.h"
  2.  
  3. using namespace System;
  4. using namespace System::Runtime::InteropServices;
  5. using namespace System::Text;
  6.  
  7. [DllImport("winmm.dll")]
  8. extern Int32 mciSendString(String^ lpstrCommand, StringBuilder^ lpstrReturnString,
  9. int uReturnLength, IntPtr hwndCallback);
  10.  
  11. static void DoEvents()
  12. {
  13. Console::SetCursorPosition(0, 6);
  14. Console::Write("Abriendo...");
  15. }
  16.  
  17. static void DoEvents2()
  18. {
  19. Console::SetCursorPosition(0, 6);
  20. Console::Write("Cerrando...");
  21. }
  22.  
  23. int main(array<System::String ^> ^args)
  24. {
  25. StringBuilder^ rt = gcnew StringBuilder(127);
  26.  
  27. // Título de la ventana.
  28. Console::Title = "Control lector de bandeja. C++ CLR";
  29.  
  30. // Tamaño ventana consola.
  31. Console::WindowWidth = 29; // X. Ancho.
  32. Console::WindowHeight = 8; // Y. Alto.
  33.  
  34.  // Cursor invisible.
  35. Console::CursorVisible = false;
  36.  
  37. // Posición del mansaje en la ventana.
  38. Console::SetCursorPosition(0, 0);
  39. Console::WriteLine("Control bandeja del lector : \n\n" +
  40. "A - Abrir bandeja. \n" +
  41. "C - Cerrar bandeja. \n" +
  42. "========================== \n");
  43. //Console::WriteLine("A - Abrir bandeja.");
  44. //Console::WriteLine("C - Cerrar bandeja.");
  45. //Console::Write("==========================");
  46.  
  47. ConsoleKey key;
  48. //Console::CursorVisible = false;
  49. do
  50. {
  51. key = Console::ReadKey(true).Key;
  52.  
  53. String^ mensaje = "";
  54.  
  55. //Asignamos la tecla presionada por el usuario
  56. switch (key)
  57. {
  58. case ConsoleKey::A:
  59. mensaje = "Abriendo...";
  60. Console::SetCursorPosition(0, 6);
  61. DoEvents();
  62. mciSendString("set CDAudio door open", rt, 127, IntPtr::Zero);
  63. mensaje = "Abierto.";
  64. break;
  65.  
  66. case ConsoleKey::C:
  67. mensaje = "Cerrando...";
  68. Console::SetCursorPosition(0, 6);
  69. DoEvents2();
  70. mciSendString("set CDAudio door closed", rt, 127, IntPtr::Zero);
  71. mensaje = "Cerrado.";
  72. break;
  73. }
  74.  
  75. Console::SetCursorPosition(0, 6);
  76. Console::Write("           ");
  77. Console::SetCursorPosition(0, 6);
  78. Console::Write(mensaje);
  79.  
  80. } while (key != ConsoleKey::Escape);
  81.    return 0;
  82. }

Saludos.


En línea

SubAtomicParticula

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #1 en: 18 Noviembre 2017, 16:40 pm »

Esto sería una sencilla traducción, claro está faltan algunas cosas como situar el cursor, etc.

using namespace std;

#include <windows.h>
#include <mmsystem.h>
#include <conio.h>

#pragma comment(lib, "Winmm.lib")

int main()
{
   char Opcion;
   printf("Menu\n");
   printf("A - Abrir Bandeja\n");
   printf("C - Cerrar Bandeja\n");
   do {
      Opcion = _getch();
   } while (Opcion != 'A' && Opcion != 'C');
   switch (Opcion) {
   case 'A':
      printf("Abriendo...\n");
      mciSendStringA("set CDAudio door open", NULL, NULL, NULL);
      printf("Abierto.\n");
      break;
   case 'C':
      printf("Cerrando...\n");
      mciSendStringA("set CDAudio door closed", NULL, NULL, NULL);
      printf("Cerrado.\n");
      break;
   }
    return 0;
}


En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #2 en: 19 Noviembre 2017, 00:10 am »

Buenas:

Tu programa ejecuta pero no pasa nada si pulso las teclas.

Intenté hacerlo como pude a mi manera pero no ejecuta.

Código
  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "Windows.h"
  4. #include "iostream"
  5. #include "string"
  6. #include "conio.h"
  7.  
  8. using namespace std;
  9.  
  10.  
  11. int main()
  12. {
  13. // Título de la ventana.
  14. SetConsoleTitle(L"Abrir y cerrar bandeja del disco C++ Win32");
  15.  
  16. // Variable
  17. char entrada[] = "\0"; // Guarda A, a, C, y c tipo string que introduces desde la consola.
  18.  
  19. while (true)
  20. {
  21. printf("Control bandeja del lector : \n\n");
  22. printf("A - Abrir bandeja. \n");
  23. printf("C - Cerrar bandeja. \n");
  24. printf("========================== \n\n");
  25.  
  26. cin >> entrada; // Aquí introduces letras A, a, C, y c.
  27.  
  28. switch (srt.tolower(entrada)) // Espera recibir A, a, C, y c. Transforma en minúscula.
  29. {
  30. // Abrir bandeja.
  31. case 'a':
  32. cout << "Abriendo..." << endl; // Muestra en pantalla textos.
  33. //printf("Abriendo...");
  34. // Aquí va un evento para que aparezca la palabra Abirendo... mientra se está abriendo el lector.
  35. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  36. cout << "Abierto." << endl; // Muestra en pantalla textos.
  37. break;
  38.  
  39. // Cerrar bandeja.
  40. case 'b':
  41. cout << "Cerrando..." << endl; // Muestra en pantalla textos.
  42. // Aquí va un evento.
  43. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  44. cout << "Cerrado." << endl; // Muestra en pantalla textos.
  45. break;
  46.  
  47. default: // Si haz pulsado otro caracter distinto de A, C, a, y c aparece
  48. cout << "Solo pulsar A o C." << endl; // este mensaje.
  49. }
  50. }
  51. return EXIT_SUCCESS;
  52. }

Algo se nos escapa.

Saludos.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #3 en: 19 Noviembre 2017, 02:01 am »

Muchas cosas:
srt.tolower(entrada)
srt no existe ¿qué querías decir?

Capturas una cadena, entrada, pero solo necesitas un carácter. ¿No sería mejor capturar un carácter?

En el switch, creo yo, intentas comparar una cadena entera con un caracter. Son dos cosas totalmente diferentes.

Tu case es 'a' y 'b' pero en el programa pides las letras 'A' y 'C'.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #4 en: 19 Noviembre 2017, 04:29 am »

Hola:

Una aclaración de lo que quiero hacer.

Puedo introducir estas letras, A, a, C y c. Si introduzco otra cosa, las ignora.

Si en el teclado pulso la letra A mayúscula, pues con el str.ToLower quería que cualquier letra que pulse mayúscula, lo convierta en minúscula.

He comprobado que tu código al final si funciona, si pongo el teclado en mayúscula activado. Solo falta la soltura de vovler a preguntar siempre las teclas en vez de cerrarse el programa.

Aún así, tu código, buen trabajo. Ya vamos paso a paso.

Saludos.
« Última modificación: 19 Noviembre 2017, 05:08 am por Meta » En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #5 en: 20 Noviembre 2017, 11:19 am »

Hola de nuevo:

Estoy haciendo pruebas con MFC C++ y funciona de maravilla, lo que no se cambiar el tamaño de la etiqueta cuando dice Abierto.

Puedo abrir y cerrar la bandeja con este código. Parece mentira con MFC me parezca más fácil que en modo consola, impresioante.



Código
  1. // MFC_ProbandoDlg.cpp: archivo de implementación
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "MFC_Probando.h"
  6. #include "MFC_ProbandoDlg.h"
  7. #include "afxdialogex.h"
  8. #include "mmsystem.h" // No olvidar.
  9.  
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #endif
  13.  
  14.  
  15. // Cuadro de diálogo de CMFCProbandoDlg
  16.  
  17.  
  18.  
  19. CMFCProbandoDlg::CMFCProbandoDlg(CWnd* pParent /*=NULL*/)
  20. : CDialog(IDD_MFC_PROBANDO_DIALOG, pParent)
  21. {
  22. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  23. }
  24.  
  25. void CMFCProbandoDlg::DoDataExchange(CDataExchange* pDX)
  26. {
  27. CDialog::DoDataExchange(pDX);
  28. }
  29.  
  30. BEGIN_MESSAGE_MAP(CMFCProbandoDlg, CDialog)
  31. ON_WM_PAINT()
  32. ON_WM_QUERYDRAGICON()
  33. ON_BN_CLICKED(IDC_BUTTON_ABRIR, &CMFCProbandoDlg::OnBnClickedButtonAbrir)
  34. ON_BN_CLICKED(IDC_BUTTON_CERRAR, &CMFCProbandoDlg::OnBnClickedButtonCerrar)
  35. END_MESSAGE_MAP()
  36.  
  37.  
  38. // Controladores de mensajes de CMFCProbandoDlg
  39.  
  40. BOOL CMFCProbandoDlg::OnInitDialog()
  41. {
  42. CDialog::OnInitDialog();
  43.  
  44. // Establecer el icono para este cuadro de diálogo.  El marco de trabajo realiza esta operación
  45. //  automáticamente cuando la ventana principal de la aplicación no es un cuadro de diálogo
  46. SetIcon(m_hIcon, TRUE); // Establecer icono grande
  47. SetIcon(m_hIcon, FALSE); // Establecer icono pequeño
  48.  
  49. // TODO: agregar aquí inicialización adicional
  50.  
  51. return TRUE;  // Devuelve TRUE  a menos que establezca el foco en un control
  52. }
  53.  
  54. // Si agrega un botón Minimizar al cuadro de diálogo, necesitará el siguiente código
  55. //  para dibujar el icono.  Para aplicaciones MFC que utilicen el modelo de documentos y vistas,
  56. //  esta operación la realiza automáticamente el marco de trabajo.
  57.  
  58. void CMFCProbandoDlg::OnPaint()
  59. {
  60. if (IsIconic())
  61. {
  62. CPaintDC dc(this); // Contexto de dispositivo para dibujo
  63.  
  64. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  65.  
  66. // Centrar icono en el rectángulo de cliente
  67. int cxIcon = GetSystemMetrics(SM_CXICON);
  68. int cyIcon = GetSystemMetrics(SM_CYICON);
  69. CRect rect;
  70. GetClientRect(&rect);
  71. int x = (rect.Width() - cxIcon + 1) / 2;
  72. int y = (rect.Height() - cyIcon + 1) / 2;
  73.  
  74. // Dibujar el icono
  75. dc.DrawIcon(x, y, m_hIcon);
  76. }
  77. else
  78. {
  79. CDialog::OnPaint();
  80. }
  81. }
  82.  
  83. // El sistema llama a esta función para obtener el cursor que se muestra mientras el usuario arrastra
  84. //  la ventana minimizada.
  85. HCURSOR CMFCProbandoDlg::OnQueryDragIcon()
  86. {
  87. return static_cast<HCURSOR>(m_hIcon);
  88. }
  89.  
  90.  
  91.  
  92. void CMFCProbandoDlg::OnBnClickedButtonAbrir()
  93. {
  94. // TODO: Agregue aquí su código de controlador de notificación de control.
  95. SetDlgItemText(IDC_STATIC_MENSAJE, L"Abriendo..."); // Mostrar texto.
  96. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr); // Abrir bandeja.
  97. SetDlgItemText(IDC_STATIC_MENSAJE, L"Abierto."); // Mostrar texto.
  98. }
  99.  
  100.  
  101. void CMFCProbandoDlg::OnBnClickedButtonCerrar()
  102. {
  103. // TODO: Agregue aquí su código de controlador de notificación de control.
  104. SetDlgItemText(IDC_STATIC_MENSAJE, L"Cerrando..."); // Mostrar texto.
  105. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr); // Cerrar bandeja.
  106. SetDlgItemText(IDC_STATIC_MENSAJE, L"Cerrado."); // Mostrar texto.
  107. }

Siguiendo con el código de C++ en moco consola, he quitado el santo Switch y he usado el else if, ahora puedo abrir la bandeja, pero no puedo cerrarla.

Código
  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "Windows.h"
  4. #include "iostream"
  5. #include "string"
  6. #include "conio.h"
  7. #include "string"
  8.  
  9. using namespace std;
  10.  
  11.  
  12. int main()
  13. {
  14. // Título de la ventana.
  15. SetConsoleTitle(L"Abrir y cerrar bandeja del disco C++ Win32");
  16.  
  17. // Variable
  18. char entrada[] = "\0"; // Guarda A, a, C, y c tipo string que introduces desde la consola.
  19.  
  20. while (true)
  21. {
  22. cout << "Control bandeja del lector : \n\n" << endl; // Muestra en pantalla textos.
  23. cout << "A - Abrir bandeja. \n" << endl;
  24. cout << "C - Cerrar bandeja. \n" << endl;
  25. cout << "========================== \n\n" << endl;
  26.  
  27. cin >> entrada; // Aquí introduces letras A, a, C, y c.
  28.  
  29. int i = 0;
  30. char c;
  31.  
  32. while (entrada[i])
  33. {
  34. c = entrada[i];
  35. putchar(tolower(c));
  36. i++;
  37. }
  38.  
  39. string str(entrada);
  40.  
  41. // Abrir bandeja.
  42. if (str == "a")
  43. {
  44. cout << "Abriendo..." << endl; // Muestra en pantalla textos.
  45.   //printf("Abriendo...");
  46.   // Aquí va un evento para que aparezca la palabra Abirendo... mientra se está abriendo el lector.
  47. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  48. cout << "Abierto." << endl; // Muestra en pantalla textos.
  49. } // Cerrar bandeja.
  50. else if (str == "b")
  51. {
  52. cout << "Cerrando..." << endl; // Muestra en pantalla textos.
  53.   // Aquí va un evento.
  54. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  55. cout << "Cerrado." << endl; // Muestra en pantalla textos.
  56. }
  57. else // Si haz pulsado otro caracter distinto de A, C, a, y c aparece
  58. {
  59. cout << "Solo pulsar A o C." << endl; // este mensaje.
  60.  
  61. }
  62.  
  63. }
  64. return EXIT_SUCCESS;
  65. }

¿Alguna idea?

Saludos.
« Última modificación: 20 Noviembre 2017, 11:33 am por Meta » En línea

SubAtomicParticula

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #6 en: 20 Noviembre 2017, 18:31 pm »

Ole, campeón. Te has resuelto el tema, solo te falta cambiar la "b" por "c", jejeje.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Adaptar C++ CLR a C++ Win32
« Respuesta #7 en: 20 Noviembre 2017, 20:43 pm »

Ole, campeón. Te has resuelto el tema, solo te falta cambiar la "b" por "c", jejeje.

No lo he resuelto arriba, lo acabo de resolver ahora que pongo los resultado aquí mismo. Lo que he resuelto arriba es MFC C++ 2017.

Código
  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. #include "Windows.h"
  4. #include "iostream"
  5. #include "string"
  6. #include "conio.h"
  7. #include "string"
  8. #include "locale"
  9.  
  10. using namespace std;
  11.  
  12.  
  13. int main()
  14. {
  15. // Título de la ventana.
  16. SetConsoleTitle(L"Abrir y cerrar bandeja del disco C++ Win32");
  17.  
  18. // Variable
  19. char entrada[] = "\0"; // Guarda A, a, C, y c tipo string que introduces desde la consola.
  20.  
  21. while (true)
  22. {
  23. cout << "Control bandeja del lector : \n\n" << endl; // Muestra en pantalla textos.
  24. cout << "A - Abrir bandeja. \n" << endl;
  25. cout << "C - Cerrar bandeja. \n" << endl;
  26. cout << "========================== \n\n" << endl;
  27.  
  28. cin >> entrada; // Aquí introduces letras A, a, C, y c.
  29.  
  30. cout << "\n" << endl;
  31.  
  32.  
  33.  
  34.  
  35. // Abrir bandeja.
  36. if (entrada[0] == 'a' || entrada[0] == 'A')
  37. {
  38. cout << "Abriendo..." << endl << endl; // Muestra en pantalla textos.
  39. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  40. cout << "Abierto." << endl << endl; // Muestra en pantalla textos.
  41. } // Cerrar bandeja.
  42. else if (entrada[0] == 'c' || entrada[0] == 'C')
  43. {
  44. cout << "Cerrando..." << endl << endl; // Muestra en pantalla textos.
  45. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  46. cout << "Cerrado." << endl << endl; // Muestra en pantalla textos.
  47. }
  48. else // Si haz pulsado otro caracter distinto de A, C, a, y c aparece
  49. {
  50. cout << "Solo pulsar A o C." << endl << endl; // este mensaje.
  51.  
  52. }
  53.  
  54. }
  55. return EXIT_SUCCESS;
  56. }

Gracias por todo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
adaptar impedancia
Electrónica
MITNICK 2 3,383 Último mensaje 29 Marzo 2004, 09:53 am
por Meta
adaptar teclado
Electrónica
marian0 1 2,391 Último mensaje 18 Abril 2005, 10:40 am
por + enrique ZP
Ayuda win32.beginupdateresource(), win32.updateresource(), no funciona.
.NET (C#, VB.NET, ASP)
krosty123 2 3,562 Último mensaje 6 Noviembre 2010, 04:10 am
por krosty123
Adaptar web a IE8 y anteriores
Desarrollo Web
Jnex 7 3,480 Último mensaje 3 Marzo 2012, 14:18 pm
por manudg
Adaptar codigo
Programación Visual Basic
Jorgenew 0 1,379 Último mensaje 1 Agosto 2013, 20:44 pm
por Jorgenew
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines