API диспетчера очереди Windows GetPrinter () не возвращает должным образом заполненную структуру PRINTER_INFO_6 - PullRequest
0 голосов
/ 05 июня 2019

Я использую API очереди принтера для получения информации о состоянии принтера PRINTER_INFO_6 с использованием функции GetPrinter().

Myцель состоит в том, чтобы определить состояние бумаги (PRINTER_STATUS_PAPER_JAM, PRINTER_STATUS_PAPER_OUT, PRINTER_STATUS_PAPER_PROBLEM) и состояние тонера (PRINTER_STATUS_TONER_LOW, PRINTER_STATUS_NO_TONER).

Странно, независимо от состояния принтера, элемент dwStatusвсегда ноль.

Следующий код извлекает информацию о состоянии принтера из принтера по умолчанию и отображает ее на экране:

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>


int main( void )
{
    HANDLE hPrinter = INVALID_HANDLE_VALUE;
    PPRINTER_INFO_6 pInfo = NULL;
    DWORD dwNeeded = 0L;
    CHAR szPrinterName[ MAX_PATH + 1 ] = {0};
    DWORD dwLength = MAX_PATH;
    BOOL ret = FALSE;


    ret = GetDefaultPrinter( szPrinterName, &dwLength );

    if( ret == FALSE )
    {
        fprintf(stderr, "[FATAL] GetDefaultPrinter() failed: %lu\n", GetLastError() );
        return EXIT_FAILURE;
    }

    ret = OpenPrinter( szPrinterName, &hPrinter, NULL );

    if( ret == FALSE )
    {
        fprintf(stderr, "[FATAL] OpenPrinter( '%s' ) failed: %lu\n", szPrinterName, GetLastError() );
        return EXIT_FAILURE;
    }

    GetPrinter( hPrinter, 6, NULL, 0, &dwNeeded );

    if(!dwNeeded)
    {
        fprintf(stderr, "[FATAL] GetPrinter() failed: %lu\n", GetLastError() );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }

    pInfo = (PRINTER_INFO_6*) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwNeeded );

    if( pInfo == NULL )
    {
        fprintf(stderr, "[FATAL] HeapAlloc() failed: %lu\n", GetLastError() );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }

    ret = GetPrinter( hPrinter, 6, (LPBYTE) pInfo, dwNeeded, &dwNeeded );

    if( ret == FALSE )
    {
        fprintf(stderr, "[FATAL] GetPrinter() failed: %lu\n", GetLastError() );
        HeapFree( GetProcessHeap(), 0, pInfo );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }

    fprintf( stdout, "pInfo->dwStatus: 0x%08lX\n", pInfo->dwStatus );

    HeapFree( GetProcessHeap(), 0, pInfo );
    ClosePrinter( hPrinter );
    return EXIT_SUCCESS;
}

В приведенном выше коде pInfo->dwStatus всегда равен 0x00000000.

Может кто-нибудь сказать мне, что не так?Улики?

1 Ответ

0 голосов
/ 10 июня 2019

Моя цель - определить состояние бумаги (PRINTER_STATUS_PAPER_JAM, PRINTER_STATUS_PAPER_OUT, PRINTER_STATUS_PAPER_PROBLEM) и состояние тонера (PRINTER_STATUS_TONER_LOW, PRINTER_STATUS_NO_TONER).

Состояние печатиизменено на указанное выше значение только в том случае, если у принтера есть проблема, указанная выше.Status = 0 означает, что принтер в настоящее время находится в режиме ожидания / готов.Если вы введете в Google ключевое слово «Коды состояния принтера», вы увидите, что Код состояния = 0 означает, что принтер готов.Похоже, что это не было задокументировано или определено как макрос.

Состояние проблемы с бумагой и тонером похоже на «состояние выполнения», если вы не начнете печатать, то такой код состояния проблемы не будет установлен,Например, вы должны позвонить GetLastError() после API, но не раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...