프린터 및 인쇄 작업 상태를 가져오는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 160129 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

프린터 및 인쇄 작업 상태는 기준으로 Win32 스풀러 인쇄 작업 despool 동안 업데이트됩니다. 해당 프린터 않은 despooling 및 없음 상태의 정보를 보고하는 전혀 다른 시간은 프린터 준비 및 유휴 것으로 간주됩니다.

추가 정보

Win32 API에 의해 참조되는 것처럼 "프린터" 프린터 드라이버, 인쇄 대기열 및 실제 프린터 입/출력 경로가 구성되어 있습니다. 운영 체제에 의해 생성되고 있는 프린터로 이 문서의 나머지 부분에서는 참조 "프린터 시스템을 통해 전달되는 인쇄 작업의 대상으로 단순히 실제 프린터를 처리합니다.

프린터 가장 보이는 부분에서 인쇄 대기열에 있습니다. 인쇄 관리자 또는 Windows 95 스타일 사용자 인터페이스가 있는 프린터 폴더에 의해 관리됩니다. 프린터 드라이버에서 프린터 DC를 통해 인쇄 작업을 만들려면 응용 프로그램에서 사용하는 프린터에 인터페이스입니다. 프린터 I/O 경로를 사용하여 포트 모니터를 작성해야 시스템 코드의 여러 계층에 구성됩니다.

포트 모니터를 실제 프린터의 프린터 시스템 하위 스트림 끝에 인터페이스 및 실제 프린터 모든 연결이 설정된 걸쳐 인쇄 작업의 데이터 전송에 담당합니다. 양방향 프린터 포트 모니터를 담당하는 실제 프린터 간에 데이터를 전송할 수 있습니다. 이 연결 및 실제 프린터 위치를 오류가 발생할 수 있습니다. 이러한 오류를 보고하려면 포트 모니터를 작업입니다.

스풀러, 실제 프린터의 프린터 연결된 상태를 쿼리하지 않습니다. 대신, 실제 프린터 상태를 통해 포트 모니터를 스풀링이 시간에 인쇄 작업의 성공 여부를 결정합니다. 이 과정에서 일부 오류가 발생하는 경우 오류 포트 모니터를 통해 보고된 및 인쇄 작업 상태 정보가 기록됩니다. 결과적으로 스풀러, 프린터 대기열 적절한 오류 정보를 전파합니다.

따라서 프린터 큐가 비어 있을 때 시스템 프린터 상태를 보고합니다. 이 상태에서는 프린터에서 인쇄 작업의 받을 준비가 간주됩니다. 실제 프린터가 오류가 있는 경우에도 유효한 가정 있습니다 예: 오프라인으로 상태. 운영 체제의 몇 가지 이유로 실제 프린터 배달 완료할 수 없는 경우 인쇄 작업을 수락할 준비가 프린터를 간주합니다. 이러한 상황에 사용자에 의해 처리되어야 하는 운영 체제 오류 상태에 간주됩니다. 이 오류가 reportable 인쇄 작업의 스풀링 성공적으로 완료할 수 있는 응용 프로그램으로 간주되지 않습니다.

실제 프린터 상태 확인

실제 프린터 상태를 확인하려면 참이어야 하는 한 가지 기본적인 전제 있습니다: 실제 프린터로 인쇄 작업을 보낼 수 있는 스풀러 했을 합니다. 이 프린터의 상태를 포트 모니터를 통해 보고된 유일한 시간이 있습니다. 또한 일부 포트 모니터를 이러한 값을 직접 설정한 수 있기 때문에 해당 특정 인쇄 작업에 대한 JOB_INFO 구조체의 상태 멤버가 가장 의미 있는 정보가 보고될 수 있습니다.

JOB_INFO 구조를 상태 멤버 및 pStatus 구성원이 포함되어 있습니다. 두 멤버에 포트 모니터를 통해 보고된 인쇄 작업 상태 정보가 포함되어 있습니다. 이러한 두 멤버를 pStatus 구성원 거의 포함될 수 있는 문자열로 마우스 포인터가 있을 때 미리 결정된 값을 포함하는 비트 필드에 상태 상태 구성원입니다 점에서 다릅니다. 이러한 값은 Win32 SDK 및 WinSpool.h 헤더 파일에 설명되어 있습니다. pStatus 구성원 때로는 항상 그런 것은 아니지만, 상태 설명 문자열은 설정합니다. 이 문자열의 내용은 각 포트 모니터에 의해 정의됩니다.

JOB_INFO 구조를 두 API 함수를 통해 반환되는: GetJob 및 EnumJobs. EnumJobs는 JOB_INFO 구조체의 배열을 요구하지 않고 호출자가 참조 특정 작업에 프린터 대기열에서 반환합니다. 현재 (인쇄) despooling 인쇄 작업 상태 정보가 포함됩니다. 배열에 있는 이 작업을 찾으려면 해당 상태 구성원이 비트 JOB_STATUS_PRINTING 설정된 인쇄 작업을 찾으려면 JOB_INFO 구조체 배열을 검색하십시오.

프린터 상태를 확인하는 동안 쉽게 메서드를 PRINTER_INFO 구조체의 상태 멤버 검토하는 것입니다. 이 구조는 GetPrinter 함수에 의해 반환됩니다. 보다 자세한 또는 광범위한 상태 정보를 제공할 수 있는 PRINTER_INFO 구조를 pStatus 문자열 구성원 점에서 이 방법의 단점은 있습니다. 그러나 있을 장점이 해당 포트 모니터를 일부 좀 더 광범위한 프린터 PRINTER_INFO 구조의 상태 비트를 설정할 수 있습니다. 그러나 Windows 기본 포트 모니터를 일반적으로 있는 프린터 상태 멤버의 PRINTER_STATUS_ERROR 비트 이상의 설정하지 것을 유의하십시오.

참고 두 구조의 집합 상태 멤버의 엄격하게 실제 프린터 관련 상태 정보를 포함할 수 있습니다. 예를 들어, PRINTER_STATUS_PAUSED 또는 인쇄 대기열 엄격하게 관련된 PRINTER_STATUS_PENDING_DELETION, PRINTER_INFO 구조 상태 구성원으로 설정할 수 있습니다. 또한 JOB_INFO 구조체의 상태 멤버를 JOB_STATUS_PAUSED 또는 해당 특정 인쇄 작업에만 관련된 JOB_STATUS_DELETING, 상태 값이 포함될 수 있습니다. 또한 스풀링이 있어야 JOB_STATUS_PRINTED 상태로 남아 있을 때와 후 인쇄 작업을 인쇄 큐에 누적될 수 유의하십시오.

이러한 함수들은 원하는 프린터 식별하기 위해 프린터 핸들이 필요합니다. 이 핸들은 OpenPrinter 함수는 프린터의 이름을 포함하는 문자열을 가져옵니다. UNC 공유 네트워크 프린터 이름 또는 이 이름은 프린터의 로컬 이름을 수 있습니다.

다음 샘플 코드에서는 JOB_INFO 구조를 제대로 검색하려면 EnumJobs 함수를 호출하는 방법과 PRINTER_INFO 구조를 검색하려면 GetPrinter 함수를 호출하는 방법을 보여 줍니다.

예제 코드

   BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */ 

                JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */ 
                int *pcJobs,            /* Count of jobs filled.  */ 
                DWORD *pStatus)         /* Print Queue status.    */ 

   {

   DWORD               cByteNeeded,
                        nReturned,
                        cByteUsed;
    JOB_INFO_2          *pJobStorage = NULL;
    PRINTER_INFO_2       *pPrinterInfo = NULL;

   /* Get the buffer size needed. */ 
       if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               return FALSE;
       }

       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
       if (!(pPrinterInfo))
           /* Failure to allocate memory. */ 
           return FALSE;

       /* Get the printer information. */ 
       if (!GetPrinter(hPrinter,
               2,
               (LPSTR)pPrinterInfo,
               cByteNeeded,
               &cByteUsed))
       {
           /* Failure to access the printer. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       /* Get job storage space. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               NULL,
               0,
               (LPDWORD)&cByteNeeded,
               (LPDWORD)&nReturned))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
           {
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }
       }

       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
       if (!pJobStorage)
       {
           /* Failure to allocate Job storage space. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       ZeroMemory(pJobStorage, cByteNeeded);

       /* Get the list of jobs. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               (LPBYTE)pJobStorage,
               cByteNeeded,
               (LPDWORD)&cByteUsed,
               (LPDWORD)&nReturned))
       {
           free(pPrinterInfo);
           free(pJobStorage);
           pJobStorage = NULL;
           pPrinterInfo = NULL;
           return FALSE;
       }

       /*
        *  Return the information.
        */ 
       *pcJobs = nReturned;
       *pStatus = pPrinterInfo->Status;
       *ppJobInfo = pJobStorage;
       free(pPrinterInfo);

       return TRUE;

   }

   BOOL IsPrinterError(HANDLE hPrinter)
   {

       JOB_INFO_2  *pJobs;
       int         cJobs,
                   i;
       DWORD       dwPrinterStatus;

       /*
        *  Get the state information for the Printer Queue and
        *  the jobs in the Printer Queue.
        */ 
       if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus))
			return FALSE;

       /*
        *  If the Printer reports an error, believe it.
        */ 
       if (dwPrinterStatus &
           (PRINTER_STATUS_ERROR |
           PRINTER_STATUS_PAPER_JAM |
           PRINTER_STATUS_PAPER_OUT |
           PRINTER_STATUS_PAPER_PROBLEM |
           PRINTER_STATUS_OUTPUT_BIN_FULL |
           PRINTER_STATUS_NOT_AVAILABLE |
           PRINTER_STATUS_NO_TONER |
           PRINTER_STATUS_OUT_OF_MEMORY |
           PRINTER_STATUS_OFFLINE |
           PRINTER_STATUS_DOOR_OPEN))
       {
           free( pJobs );
           return TRUE;
       }

       /*
        *  Find the Job in the Queue that is printing.
        */ 
       for (i=0; i < cJobs; i++)
       {
           if (pJobs[i].Status & JOB_STATUS_PRINTING)
           {
               /*
                *  If the job is in an error state,
                *  report an error for the printer.
                *  Code could be inserted here to
                *  attempt an interpretation of the
                *  pStatus member as well.
                */ 
               if (pJobs[i].Status &
                   (JOB_STATUS_ERROR |
                   JOB_STATUS_OFFLINE |
                   JOB_STATUS_PAPEROUT |
                   JOB_STATUS_BLOCKED_DEVQ))
               {
                   free( pJobs );
                   return TRUE;
               }
           }
       }

       /*
        *  No error condition.
        */ 
       free( pJobs );
       return FALSE;

   }
				
참고: Windows NT에서 프린터 풀링을 사용할 경우 있을 수 둘 이상의 인쇄 작업 상태 보고서 프린터 큐에서 despooling. 이 예제 코드를 해당 상황에 고려하지 않습니다.

참조

스풀러 Win32 함수를 호출하여 일반 지침에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
158828호출 Wind32 스풀러 열거형 API 방법 제대로

속성

기술 자료: 160129 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 4.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Application Programming Interface?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows NT Server 3.51
    • Microsoft Windows NT Server 4.0 Standard Edition
    • Microsoft Windows NT Workstation 3.51
    • Microsoft Windows NT Workstation 4.0 Developer Edition
    • Microsoft Windows 95
키워드:?
kbmt kbfaq kbhowto KB160129 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com