Visual C++ .NET - Problemas al detectar estado de impresora en c++

 
Vista:
sin imagen de perfil

Problemas al detectar estado de impresora en c++

Publicado por Red (3 intervenciones) el 08/05/2015 15:22:34
Pues eso, me resulta muy extraño que el campo status de la impresora siempre marca 0, esté o no la impresora conectada, es una impresora conectada mediante usb.
El código que uso es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DWORD Impresora::getStatus()
{
  HANDLE hHandle = 0;
  DWORD dwStatus = 0;
  DWORD dwSize = 0;
  PRINTER_INFO_2* pPrnInfo2 = 0;
  DEVMODE DevMode = {0};
  PRINTER_DEFAULTS PrnDef = { 0, &DevMode, PRINTER_ACCESS_USE };
 
  if( !OpenPrinter( EPS_PRINTER_NAME, &hHandle, &PrnDef ) )printf("ERROR\n");
  GetPrinter( hHandle, 2, 0, 0, &dwSize );
 
  if( !dwSize )printf("ERROR\n");
  pPrnInfo2 = (PRINTER_INFO_2*)malloc( dwSize );
 
  // Receive printer details 
  if(!GetPrinter( hHandle, 2, (LPBYTE)pPrnInfo2, dwSize, &dwSize ))printf("ERROR\n");
 
  dwStatus = pPrnInfo2->Status;
  printf("dwStatus -> %lu \n", dwStatus);
 
  // Free allocated memory 
  free( pPrnInfo2 );
  ClosePrinter( hHandle );
  return dwStatus;
}

Pues eso, no se que estará pasando porque en teoria esto deberia funcionar.
Gracias por adelantado!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Obtener el estado actual de una impresora en Visual C++

Publicado por Alejandro (265 intervenciones) el 13/02/2024 23:25:55
Red, el código que proporcionaste está utilizando la función `GetPrinter` para obtener información sobre la impresora, específicamente `PRINTER_INFO_2`. La propiedad que estás tratando de obtener es `Status` de la estructura `PRINTER_INFO_2`.

Sin embargo, el campo `Status` de `PRINTER_INFO_2` no proporciona información en tiempo real sobre el estado de la impresora, sino más bien información sobre el estado de la cola de impresión en el momento en que se consultó la impresora por última vez.

Si deseas obtener el estado actual de la impresora, necesitarías utilizar la función `GetPrinter` con `PRINTER_INFO_5` y revisar el campo `Attributes` en la estructura resultante. El valor que deberías verificar es `PRINTER_ATTRIBUTE_WORK_OFFLINE`. Aquí hay un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
DWORD Impresora::getStatus()
{
    HANDLE hHandle = 0;
    PRINTER_INFO_5* pPrnInfo5 = 0;
    DWORD dwSize = 0;
    DEVMODE DevMode = {0};
    PRINTER_DEFAULTS PrnDef = {0, &DevMode, PRINTER_ACCESS_USE};
 
    if (!OpenPrinter(EPS_PRINTER_NAME, &hHandle, &PrnDef))
    {
        printf("ERROR\n");
        return 0;
    }
 
    GetPrinter(hHandle, 5, 0, 0, &dwSize);
 
    if (!dwSize)
    {
        printf("ERROR\n");
        ClosePrinter(hHandle);
        return 0;
    }
 
    pPrnInfo5 = (PRINTER_INFO_5*)malloc(dwSize);
 
    // Receive printer details
    if (!GetPrinter(hHandle, 5, (LPBYTE)pPrnInfo5, dwSize, &dwSize))
    {
        printf("ERROR\n");
        free(pPrnInfo5);
        ClosePrinter(hHandle);
        return 0;
    }
 
    DWORD dwStatus = pPrnInfo5->Attributes;
 
    if (dwStatus & PRINTER_ATTRIBUTE_WORK_OFFLINE)
    {
        printf("La impresora está desconectada.\n");
    }
    else
    {
        printf("La impresora está conectada.\n");
    }
 
    // Free allocated memory
    free(pPrnInfo5);
    ClosePrinter(hHandle);
    return dwStatus;
}

En este código, `PRINTER_ATTRIBUTE_WORK_OFFLINE` se utiliza para verificar si la impresora está desconectada. Si este atributo está presente, significa que la impresora está desconectada.

Ten en cuenta que esta información también se basa en el estado de la impresora en el momento de la consulta y podría no reflejar cambios en tiempo real. Además, verifica que `EPS_PRINTER_NAME` esté correctamente definido y que tienes permisos adecuados para acceder a la impresora.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar