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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Imprimir usando la API Windows
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Imprimir usando la API Windows  (Leído 5,111 veces)
Becerra

Desconectado Desconectado

Mensajes: 97


Siempre aprendiendo


Ver Perfil
Imprimir usando la API Windows
« en: 29 Julio 2016, 13:49 pm »

Hola

Estoy buscando la forma de mandar unos datos a una impresora usando la API de windows, nunca antes he programado directamente sobre la API, por lo que tengo un lío enorme.

Lo que necesito es, primero obtener una lista de los nombres de las impresoras instaladas en el sistema, para que el usuario pueda seleccionar una. Los nombres puedo obtenerlos mediante las librerías Qt, lo que no sé es si a partir de solo el nombre luego puedo enviarle datos.

Y una vez que el usuario haya seleccionado una, tengo que abrirla para poder enviarle una secuencia de bytes. Y ya está. Sencillo en principio, pero un lío para mi que nunca usé la API.

Así que si podéis orientarme un poco de por donde empezar estaría muy agradecido :)

Un saludo


« Última modificación: 30 Julio 2016, 21:22 pm por DoeJohn » En línea

Buenas preguntas obtienen mejores respuestas
jorgediazbass

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Imprimir usando la API Windows
« Respuesta #1 en: 29 Julio 2016, 21:57 pm »

Los lenguajes como C y C++ no definen una forma estandar de imprimir.

La razon es simple: el trabajo de impresion es una tarea específica de la plataforma, lo que implica:

No hay una forma estandar de imprimir en C/C++

Se debe usar alguna caracteristica especifica de la plataforma (como codigo no portable) y/o del compilador para imprimir algo.

Por ejemplo en Turbo C++ se puede usar stdprn para hacer referencia a la impresora e imprimir algo, tal como sigue:

Código
  1. fprintf(stdprn, "Hola mundo...\n");
  2.  
  3.  
  4. int num = 50;
  5. fprintf(stdprn, "Valor del numero: %d\n", num);



Otra forma es funcionalmente similar a trabajar con archivos, pero en lugar de abrir un archivo del disco duro, haremos referencia a la impresora con uno de los siguiente valores:

Código
  1. LPT1:
  2. PRN
  3. LPT2:

Por ejemplo en Dev-C++ podemos usar:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std ;
  4.  
  5. int main()
  6. {
  7. // Identifica el puerto de la impresora
  8. char const * const pszPrinterName = "LPT1:" ;
  9.  
  10. // Abre el flujo de la impresora
  11. ofstream prn( pszPrinterName );
  12.  
  13. // Asegura que la impresora se abrio exitosamente
  14. if ( ! prn ) {
  15. cerr << "ERROR: No se puede abrir " << pszPrinterName << '\n' ;
  16. return 1 ;
  17. }
  18.  
  19. // Imprime un mensaje
  20. prn << "Hola mundo!" ;
  21.  
  22. prn << '\r' // Retorno de carro (ENTER)
  23. << '\f' ; // Expulsa la ultima hoja de la impresora
  24.  
  25. // Cierra la impresora
  26. prn.close();
  27.  
  28. return 0;
  29. }



El siguiente código me resulto, ya que es lo que buscaba.


Impresión usando al API de Windows

Si estamos trabajando con Windows, la mejor forma es usar la API, con esto logramos que sea el propio Windows, quien se encargue de ciertas tareas.

Por ejemplo, con el siguiente código podemos imprimir un archivo de texto. Se mostrará el clásico cuadro de diálogo de impresión de Windows y podemos entonces seleccionar cualquier impresora, ya sea conectada al puerto paralelo, USB o de red:


Código
  1. //Ejemplo que muestra como imprimir un archivo de texto plano.
  2. #include <windows.h>
  3. #include <fstream>
  4. #include <string>
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. typedef std::basic_ifstream<TCHAR> tifstream;
  10. typedef std::basic_string<TCHAR> tstring;
  11.  
  12. void Outtextxy(HDC hdc,int x,int y,tstring Msg)
  13. {
  14. TextOut(hdc,x,y,Msg.c_str(),static_cast<int>(Msg.l ength()));
  15. }
  16.  
  17. void ShowError(tstring strMsg)
  18. {
  19. MessageBox (NULL,strMsg.c_str(),TEXT("Imprimir"),MB_ICONERROR );
  20. exit(1);
  21. }
  22. void ShowInformation(tstring strText)
  23. {
  24. MessageBox (NULL,strText.c_str(),TEXT("Imprimir"),MB_ICONINFO RMATION);
  25. }
  26. void PrintFile(tifstream& f)
  27. {
  28. PRINTDLG pd;
  29. DOCINFO di;
  30. tstring strLine;
  31. int y=300;
  32.  
  33. memset (&pd, 0, sizeof(PRINTDLG));
  34. memset (&di, 0, sizeof(DOCINFO));
  35.  
  36. di.cbSize = sizeof(DOCINFO);
  37. di.lpszDocName = TEXT("Imprimiendo");
  38.  
  39. pd.lStructSize = sizeof(PRINTDLG);
  40. pd.Flags = PD_PAGENUMS | PD_RETURNDC;
  41. pd.nFromPage = 1;
  42. pd.nToPage = 1;
  43. pd.nMinPage = 1;
  44. pd.nMaxPage = 0xFFFF;
  45.  
  46.  
  47. if(f.fail())
  48. ShowError(TEXT("Error el archivo no se pudo abrir para lectura"));
  49.  
  50. if (PrintDlg (&pd)){
  51. if (pd.hDC){
  52. if (StartDoc (pd.hDC, &di) != SP_ERROR){
  53. cout << "Imprimiendo...\nEspere un momento" << endl;
  54. StartPage (pd.hDC);
  55. while(!f.eof()){
  56. getline(f,strLine);
  57. Outtextxy(pd.hDC,500,y,strLine.c_str());
  58. y+=100;
  59. }
  60. EndPage (pd.hDC);
  61. EndDoc (pd.hDC);
  62.  
  63. }
  64. else
  65. ShowError(TEXT("Error: No se pudo comenzar a imprimir."));
  66.  
  67. }
  68. else
  69. ShowError(TEXT("Error: No se pudo crear el contexto de dispositivo"));
  70.  
  71. }
  72. else
  73. ShowInformation(TEXT("Se cancelo la impresion"));
  74.  
  75. ShowInformation(TEXT("Termino la impresion correctamente."));
  76. }
  77.  
  78. int main(int argc,char *argv[])
  79. {
  80.  
  81. tifstream in(TEXT("texto.txt")); /* acá va escrito el nombre del archivo que quieres imprimir */
  82. PrintFile(in);
  83. in.close();
  84. return 0;
  85. }
  86.  


Para que funcione el ejemplo debemos tener un archivo llamado texto.txt en el mismo directorio del programa ejecutable.

Si trabajamos con Dev-C++, debemos ir a Project -> Project Options -> Parameters, y en el cuadro Linker agregamos las siguientes líneas en caso de no tenerlas:

Código
  1. -lgdi32
  2. -lcomdlg32



En particular yo trabajo con Dev-C++.


En línea

Becerra

Desconectado Desconectado

Mensajes: 97


Siempre aprendiendo


Ver Perfil
Re: Imprimir usando la API Windows
« Respuesta #2 en: 30 Julio 2016, 18:25 pm »

Hola

Otra forma es funcionalmente similar a trabajar con archivos, pero en lugar de abrir un archivo del disco duro, haremos referencia a la impresora con uno de los siguiente valores:

Código
  1. LPT1:
  2. PRN
  3. LPT2:

Así es como lo tengo ahora, es decir, cuando hice el programa todas las impresoras que tenía conectaban por puerto LPT1. El problema es que todas las que me están llegando ahora se conectan por USB y claro, tengo que actualizar el programa.


Impresión usando al API de Windows

Si estamos trabajando con Windows, la mejor forma es usar la API, con esto logramos que sea el propio Windows, quien se encargue de ciertas tareas.

Por ejemplo, con el siguiente código podemos imprimir un archivo de texto. Se mostrará el clásico cuadro de diálogo de impresión de Windows y podemos entonces seleccionar cualquier impresora, ya sea conectada al puerto paralelo, USB o de red:

Yo tengo que hacerlo de otra forma, no puedo abrir el diálogo de la impresora cada vez que el programa mande algo a ella, lo que tengo que hacer es en la ventana de configuración del programa añadir una lista de las impresoras disponibles en el sistema y guardar junto con el resto de la configuración la que se haya escogido. Y luego el programa mande los datos a la impresor que corresponde.

Con Qt (que son las librerías con las que hice el programa) puedo hacer muy fácilmente la lista con las impresoras disponibles y guardar la selección del usuario.

Entonces estoy buscando la forma de poder abrir y enviarle unos bytes a la impresora que yo quiera. No sé si a partir de solo el nombre se puede hacer o hay que usar la AP de window para obtener las que hay y algún identificador o ID que use windows para poder abrirla directamente.

Un saludo
En línea

Buenas preguntas obtienen mejores respuestas
Becerra

Desconectado Desconectado

Mensajes: 97


Siempre aprendiendo


Ver Perfil
Re: Imprimir usando la API Windows
« Respuesta #3 en: 30 Julio 2016, 21:21 pm »

Hola

Bueno, pues al final encontré un trozo de código que es lo que buscaba:
http://stackoverflow.com/questions/26855598/how-to-use-qt-qprinter-to-send-cut-paper-command

(Por favor, si no se pueden indicar enlaces externos, haganmelo saber).

Tal como está, lo metí en una función que recibe un QString con el nombre de la impresora y un QByteArray con los datos y funciona sin problemas.
(QString y QByteArray son clases de Qt).

Ahora empieza el mismo problema, pero para linux XD

Un saludo
En línea

Buenas preguntas obtienen mejores respuestas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Imprimir pantalla en Windows Media.
Multimedia
StraTovario 1 2,934 Último mensaje 26 Enero 2004, 11:04 am
por Songoku
como imprimir una hoja en windows!!
Java
BEATMASTER 0 3,416 Último mensaje 25 Julio 2009, 09:03 am
por BEATMASTER
¿Como puedo imprimir una imagen en 15x15 en Windows 7 ? « 1 2 »
Windows
Ngeooz 16 16,170 Último mensaje 3 Octubre 2013, 15:25 pm
por Eleкtro
MOVIDO: ¿Como puedo imprimir una imagen en 15x15 en Windows 7 ?
Electrónica
simorg 0 3,571 Último mensaje 2 Octubre 2013, 19:23 pm
por simorg
Imprimir una imagen usando el compilador Dev C/C++
Programación C/C++
Kevrodrig 2 7,231 Último mensaje 20 Noviembre 2017, 16:58 pm
por BloodSharp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines