C/Visual C - Estados de la impresora

 
Vista:

Estados de la impresora

Publicado por Arancha (31 intervenciones) el 07/05/2003 14:40:59
Hola, estoy haciendo una aplicación que envía mensajes al puerto paralelo para imprimirlos por una impresora de carro (esto lo hago tratando el puerto paralelo como si fuera un fichero), pero necesito conocer el estado de la impresora, si está on line, off line, no disponible, etc. He probado con la función EnumPrinters y con GetPrinter que me dan bastante información , pero no rellenan el campo que indica el estado de la impresora. ¿hay alguna forma de conocer su estado, ya sea preguntando a la impresora o prefuntando al puerto paralelo?
Gracias.
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

Comprobación del estado de la impresora en el puerto paralelo

Publicado por Alejandro (1153 intervenciones) el 23/05/2025 00:44:59
Para conocer el estado de una impresora conectada a un puerto paralelo, puedes utilizar varias técnicas. A continuación, te presento algunas opciones que puedes considerar:

1. Leer el estado del puerto paralelo



Puedes leer directamente el estado del puerto paralelo utilizando las direcciones de los registros del puerto. El puerto paralelo tiene varios registros que puedes consultar para obtener información sobre su estado. Aquí hay un ejemplo de cómo hacerlo:

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
#include <stdio.h>
#include <conio.h>
#include <dos.h>
 
#define LPT1 0x378 // Dirección base del puerto paralelo LPT1
 
unsigned char readParallelPortStatus() {
    return inportb(LPT1 + 1); // Leer el registro de estado
}
 
void checkPrinterStatus() {
    unsigned char status = readParallelPortStatus();
 
    // El bit 7 (D7) indica si la impresora está fuera de línea
    if (status & 0x80) {
        printf("La impresora está OFFLINE.\n");
    } else {
        printf("La impresora está ONLINE.\n");
    }
 
    // Puedes verificar otros bits para más información
    // Bit 6 (D6) - Error de impresora
    // Bit 5 (D5) - Papel atascado
    // Bit 4 (D4) - Sin papel
}
 
int main() {
    checkPrinterStatus();
    return 0;
}

2. Usar la API de Windows



Si prefieres utilizar la API de Windows, puedes intentar obtener el estado de la impresora a través de la función `GetPrinter` y revisar la estructura `PRINTER_INFO_2`. Sin embargo, como mencionaste, esta información puede no incluir el estado específico de la impresora.

3. Consultar el estado de la impresora a través de WMI



Si estás trabajando en un entorno más moderno, puedes utilizar Windows Management Instrumentation (WMI) para consultar el estado de la impresora. Aquí hay un ejemplo básico de cómo hacerlo:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <windows.h>
#include <stdio.h>
#include <comdef.h>
#include <Wbemidl.h>
 
#pragma comment(lib, "wbemuuid.lib")
 
void checkPrinterStatusWMI() {
    HRESULT hres;
 
    // Inicializar COM
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres)) {
        printf("Error al inicializar COM.\n");
        return;
    }
 
    hres = CoInitializeSecurity(
        NULL,
        -1,                          // COM negotiates service
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,  // Default authentication
        RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation
        NULL,                        // Reserved
        EOAC_NONE,                  // Additional capabilities
        NULL                         // Reserved
    );
 
    if (FAILED(hres)) {
        printf("Error al inicializar seguridad.\n");
        CoUninitialize();
        return;
    }
 
    IWbemLocator *pLoc = NULL;
 
    // Crear el localizador WMI
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *)&pLoc);
 
    if (FAILED(hres)) {
        printf("Error al crear el localizador WMI.\n");
        CoUninitialize();
        return;
    }
 
    IWbemServices *pSvc = NULL;
 
    // Conectar al espacio de nombres WMI
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"),
        NULL, NULL, 0,
        NULL, 0, 0, &pSvc);
 
    if (FAILED(hres)) {
        printf("Error al conectar al espacio de nombres WMI.\n");
        pLoc->Release();
        CoUninitialize();
        return;
    }
 
    // Configurar el contexto de seguridad
    hres = CoSetProxyBlanket(
        pSvc,
        RPC_C_AUTHN_WINNT,
        RPC_C_AUTHZ_NONE,
        NULL,
        RPC_C_AUTHN_LEVEL_CALL,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        EOAC_NONE);
 
    if (FAILED(hres)) {
        printf("Error al configurar el contexto de seguridad.\n");
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return;
    }
 
    // Consultar el estado de la impresora
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_Printer"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
 
    if (FAILED(hres)) {
        printf("Error al ejecutar la consulta WMI.\n");
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return;
    }
 
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
 
    while (pEnumerator) {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
        if (0 == uReturn) {
            break;
        }
 
        VARIANT vtProp;
 
        // Obtener el estado de la impresora
        hr = pclsObj->Get(L"WorkOffline", 0, &vtProp, 0, 0);
        printf("Estado de la impresora: %s\n", vtProp.boolVal ? "OFFLINE" : "ONLINE");
        VariantClear(&vtProp);
 
        pclsObj->Release();
    }
 
    // Liberar recursos
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
}
 
int main() {
    checkPrinterStatusWMI();
    return 0;
}

Consideraciones finales



- Compatibilidad: Asegúrate de que tu impresora y el puerto paralelo estén configurados correctamente y que la impresora esté encendida y conectada.
- Pruebas: Realiza pruebas con diferentes impresoras y configuraciones para asegurarte de que tu código funcione en todos los casos.
- Documentación: Consulta la documentación de la impresora y del puerto paralelo para obtener información específica sobre cómo interactuar con ellos.

¡Espero que esto te ayude a obtener el estado de tu impresora, Arancha!
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