C语言 Windows 后台处理程序 API GetPrinter() 未返回正确填充PRINTER_INFO_6结构



我正在使用打印机后台打印 API PRINTER_INFO_6使用GetPrinter()函数检索打印机状态信息。

我的目标是确定纸张状态(PRINTER_STATUS_PAPER_JAMPRINTER_STATUS_PAPER_OUTPRINTER_STATUS_PAPER_PROBLEM(和碳粉状态(PRINTER_STATUS_TONER_LOWPRINTER_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: %lun", GetLastError() );
        return EXIT_FAILURE;
    }
    ret = OpenPrinter( szPrinterName, &hPrinter, NULL );
    if( ret == FALSE )
    {
        fprintf(stderr, "[FATAL] OpenPrinter( '%s' ) failed: %lun", szPrinterName, GetLastError() );
        return EXIT_FAILURE;
    }
    GetPrinter( hPrinter, 6, NULL, 0, &dwNeeded );
    if(!dwNeeded)
    {
        fprintf(stderr, "[FATAL] GetPrinter() failed: %lun", GetLastError() );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }
    pInfo = (PRINTER_INFO_6*) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwNeeded );
    if( pInfo == NULL )
    {
        fprintf(stderr, "[FATAL] HeapAlloc() failed: %lun", GetLastError() );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }
    ret = GetPrinter( hPrinter, 6, (LPBYTE) pInfo, dwNeeded, &dwNeeded );
    if( ret == FALSE )
    {
        fprintf(stderr, "[FATAL] GetPrinter() failed: %lun", GetLastError() );
        HeapFree( GetProcessHeap(), 0, pInfo );
        ClosePrinter( hPrinter );
        return EXIT_FAILURE;
    }
    fprintf( stdout, "pInfo->dwStatus: 0x%08lXn", pInfo->dwStatus );
    HeapFree( GetProcessHeap(), 0, pInfo );
    ClosePrinter( hPrinter );
    return EXIT_SUCCESS;
}

在上面的代码中,pInfo->dwStatus始终0x00000000

有人可以告诉我出了什么问题吗?蛛丝马迹?

我的目标是确定纸张状态(PRINTER_STATUS_PAPER_JAMPRINTER_STATUS_PAPER_OUTPRINTER_STATUS_PAPER_PROBLEM(和碳粉 状态 ( PRINTER_STATUS_TONER_LOWPRINTER_STATUS_NO_TONER (。

仅当打印机出现上述问题时,打印状态才会更改为上述值。 Status = 0表示打印机当前处于空闲/就绪状态。如果您使用关键字"打印机状态代码",您将看到状态代码= 0表示打印机就绪。似乎它尚未被记录或定义为宏。

纸张和碳粉问题状态类似于"运行时状态",如果不开始打印,则不会设置此类问题状态代码。例如您必须在 api 之后调用GetLastError(),但不能在之前调用。

最新更新