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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [SOLUCIONADO] Solucionando errores Menú abrir y cerrar unidad CD-ROM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Solucionando errores Menú abrir y cerrar unidad CD-ROM  (Leído 7,539 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
[SOLUCIONADO] Solucionando errores Menú abrir y cerrar unidad CD-ROM
« en: 18 Noviembre 2017, 21:06 pm »

Hola:

He hecho este programa para poder abrir y cerrar la bandeja con C++ Win32. Lo que tiene que hacer es si pulsa la tecla A, se abre el lector, si pulsas C, cierra la bandeja del lector de discos.

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. }
  53.  



¿Qué tengo mal?

Saludos.


« Última modificación: 22 Noviembre 2017, 03:36 am por Meta » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Solucionando errores
« Respuesta #1 en: 18 Noviembre 2017, 21:36 pm »

¿Qué es "srt"?
En cualquier caso, cuando pongas errores, di en qué líneas se encuentran.


En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: Solucionando errores
« Respuesta #2 en: 19 Noviembre 2017, 22:27 pm »

Hola Señor.

¿Cómo estás?

Tenía que poner std, no str, me esquivoqué al escribir, en el cual también da errores.

Hice otro código pero sigue con errores.
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 "cctype"
  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. switch (tolower(entrada)) // Espera recibir A, a, C, y c. Transforma en minúscula.
  30. {
  31. // Abrir bandeja.
  32. case 'a':
  33. cout << "Abriendo..." << endl; // Muestra en pantalla textos.
  34. //printf("Abriendo...");
  35. // Aquí va un evento para que aparezca la palabra Abirendo... mientra se está abriendo el lector.
  36. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  37. cout << "Abierto." << endl; // Muestra en pantalla textos.
  38. break;
  39.  
  40. // Cerrar bandeja.
  41. case 'b':
  42. cout << "Cerrando..." << endl; // Muestra en pantalla textos.
  43. // Aquí va un evento.
  44. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  45. cout << "Cerrado." << endl; // Muestra en pantalla textos.
  46. break;
  47.  
  48. default: // Si haz pulsado otro caracter distinto de A, C, a, y c aparece
  49. cout << "Solo pulsar A o C." << endl; // este mensaje.
  50. }
  51. }
  52. return EXIT_SUCCESS;
  53. }
  54.  
  55.  

Errores:


Si que me está dando guerra.

Saludos.
« Última modificación: 19 Noviembre 2017, 22:30 pm por Meta » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Solucionando errores
« Respuesta #3 en: 20 Noviembre 2017, 19:48 pm »

tolower no convierte arrays, convierte solo 1 char: http://www.cplusplus.com/reference/cctype/tolower/

Y en cualquier caso, no puedes poner un array en un switch.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
RE: Solucionando errores
« Respuesta #4 en: 20 Noviembre 2017, 20:44 pm »

Buenas:

Problema resuelto y problema sin resolver.

El código que está abajo funciona, el programa tiene un nombre del proyecto, lo curioso que he creado otro proyecto con otro nombre, así varias veces y esta vez no hay manera de que funcione el programa. El un problema muy curioso y eso que uso el mismo código. Donde da problemas en en lo señalado abajo.

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. 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. // Muestra en pantalla textos.
  23. cout << "Control bandeja del lector : " << endl << endl;
  24. cout << "A - Abrir bandeja." << endl;
  25. cout << "C - Cerrar bandeja." << endl;
  26. cout << "==========================" << endl;
  27.  
  28. cin >> entrada; // Aquí introduces letras A, a, C, y c.
  29.  
  30. cout << "\n" << endl;
  31.  
  32. // Abrir bandeja.
  33. if (entrada[0] == 'a' || entrada[0] == 'A')
  34. {
  35. cout << "Abriendo..." << endl << endl; // Muestra en pantalla textos.
  36. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  37. cout << "Abierto." << endl << endl; // Muestra en pantalla textos.
  38. }
  39.  
  40. // Cerrar bandeja.
  41. else if (entrada[0] == 'c' || entrada[0] == 'C')
  42. {
  43. cout << "Cerrando..." << endl << endl; // Muestra en pantalla textos.
  44. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  45. cout << "Cerrado." << endl << endl; // Muestra en pantalla textos.
  46. }
  47.  
  48. // Si haz pulsado otro caracter distinto de A, C, a, y c aparece
  49. else
  50. {
  51. cout << "Solo pulsar A o C." << endl << endl; // este mensaje.
  52.  
  53. }
  54. }
  55. return EXIT_SUCCESS;
  56. }

Concretamente falla en:
Código
  1. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);

Código de error:
Citar
Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   LNK2019   símbolo externo __imp__mciSendStringW@16 sin resolver al que se hace referencia en la función _main   Bandeja_consola_win32_cpp   C:\Users\Usuario\Documents\Visual Studio 2017\Projects\Bandeja_consola_win32_cpp\Bandeja_consola_win32_cpp\Bandeja_consola_win32_cpp.obj   1   


Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Estado suprimido
Error   LNK1120   1 externos sin resolver   Bandeja_consola_win32_cpp   C:\Users\Usuario\Documents\Visual Studio 2017\Projects\Bandeja_consola_win32_cpp\Debug\Bandeja_consola_win32_cpp.exe   1   


A pesar de los enlaces que dan, no entiendo nada ni como resolverlo.
LNK2019.
LNK1120.

¿Es normal que funcione el código, para que lo vuelva a crear con otro nombre del proyecto no funcione ni una vez?

¿Qué es lo que ocurre?

Gracias por todo.
« Última modificación: 20 Noviembre 2017, 21:47 pm por Meta » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Solucionando errores
« Respuesta #5 en: 21 Noviembre 2017, 17:42 pm »

Un entorno de programación, suele por lo general traer sus propias librerías para ser usadas. en cambio otras hay que 'IMPORTARLAS', según el lenguaje se hace de una manera u otra.

El linker, lo que te está diciendo es que hay una función a la que se llama y que no sabe donde localizarla, porque en el proyecto no se encuentra implementada, ni tampoco hay una referencia a ella en parte alguna.

En resumen, debes crear una referencia (presumiblemente) a la librería winmm.dll (o la que corresponda si es otra que usas y que también tiene una función que se llama "mciSendString"

...es que además, el mensaje es bastante claro y explícito: "símbolo externo (__imp__mciSendStringW@16) sin resolver al que se hace referencia en la función ...x... de tu proyecto"

Si estás usando la librería señalada, aprovecho para indicarte que tiene  otra función algo más cómoda (opera con constantes no con cadenas de texto (formato comando)), llamada mciSendCommand, que recibe 4 parámetros,
* wDeviceID: el dispositivo al que se quiere enviar el comando.
* uMessage: una constante que identifica el comando (ver "Command Messages" en el SDK).
* dwParam1 y dwParam2: Atributos del comando.
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
[SOLUCIONADO] Solucionando errores
« Respuesta #6 en: 22 Noviembre 2017, 03:31 am »

Hola NEBIRE:

Ya descubrí el motivo, menudo despiste por mi parte. Antes hay que hacer esto. Lo pongo aquí por si alguien lo necesita.

Paso 1:


Paso 2:


Paso3:
Escribir Winmm.lib.


Paso 4:


Sólo se necesita tres includes.

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

Muchas gracias por darme ideas campeones. Me han ayudado mucho entender.

Un cordial saludos.
« Última modificación: 22 Noviembre 2017, 04:02 am por Meta » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: [SOLUCIONADO] Solucionando errores
« Respuesta #7 en: 23 Noviembre 2017, 17:58 pm »


Ya descubrí el motivo,
Suena gracioso eso de descubrir cuando te lo señalan con el dedo...
Me autocito:
Citar
En resumen, debes crear una referencia (presumiblemente) a la librería winmm.dll (o la que corresponda si es otra que usas y que también tiene una función que se llama "mciSendString"
En línea

Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Re: [SOLUCIONADO] Solucionando errores Menú abrir y cerrar unidad CD-ROM
« Respuesta #8 en: 25 Noviembre 2017, 15:13 pm »

Se me pasó por alto, ajajjajaja.

Gracias por todo campeón.  ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines