??? ??????? ?? ?????? ????? ?? ?????? ??????? ???? ?? ??? ???? ????

???? ?????? ???? ??????
???? ID: 160129 - ?? ???????? ?? ?????? ??? ?? ?? ???? ???? ???? ??.
??? ?? ??????? ???? | ??? ?? ??????? ????

?? ????? ??

??????

??????? ?? ?????? ??????? ?? ?????? despool ?? ??? ?????? ????? ?? ????? ?????? Win32 ?????? ?? ??? ???? ???? ??? ?? ???, ?? ?? ??????? despooling ???? ?? ?? ??? ?? ?????? ??????? ??????? ???? ??, ??????? ?? ????????? ????? ???? ?? ??? ???? ???

???? ???????

???????? Win32 API ??????, ?? ??? ??? ?? "???????" ??????? ???????, ?????? ??????, ?? ?????/?????? ?? ?? ????? ??????? ?? ??? comprised ??? ???????? ?????? ?? ?????? ??????? ?? ?? ?? ?? ?????? "???????," ??? ??????? ?? ??? ??? ?? ???? ?? ??? ??? ??? ???????? ?????? ???? ??? ??? ?????? ????? merely ?????? ?? ??? ??? ???? ????? ??????? treats ???

???? ??????? ?? ???????? ??? ??? ??? ??? ???? ?????? ?????? ??? ?? ?????? ??????? ?? Windows 95-???? ?????????? ???????? ??? ??????? ?????? ?????? ???????? ?? ???? ??? ??????? ??????? ?? ??????? DC ?? ?????? ?? ?????? ????? ????? ?? ??? ????????? ?????? ????? ???? ???? ?? ?? ??????? ?? ??? ??????? ??? ??? ??????? ?? ??? ?? i/O ????? ?????? ?? ??? culminating ?????? ??? ?? ?? ???? ?? ????? ??? ???? ???

????? ?????? ?????? ??????? ?? ???? ?????? ?? ??? ??? ????? ??????? ?? ??? ??????? ?? ?? ???? ?? ??? ?????? ????? ???? ?? ??? ????? ??????? ??????? whatever ????? ?? ?? ??????????? ?? ??? ?? ?? ??? ????????? ??? ????-???? ???????, ?? ????? ??? ????? ?????? ???? ?? ??? ?? ????? ??????? ?? ???? ??????????? ???? ?? ??? ????????? ???? ????? ?? ??????? ?? ????? ??????? ??, ???? ????????? ???? ???? ?? ?? ????????? ?? ??????? ???? ?? ??? ????? ?????? ?? ????? ???

?????? ?? ???? ??????? ?? ?????? ???? ???? ????? ??????? ?? ?????? ?? ??? ?????? ???? ??? ????????? ???? ?? ???? ????, ????? ??????? ?? ?????? ?? ????? ?? ?????? ????? ?? ??? ????? ?????? ?? despooled ??? ?? ????????? ??? ??? ?????? ???? ??, ??? ?????? ????? ?????? ?????? ??????? ?? ?? ?? ??? ?????? ????? ?? ?????? ?? ??????? ??? ??????? ???? ??? ??? ?????? propagates ???? ???, ??????? ???? ?? ??? ???? ?????? ??????? ???

????????, ???? ?????? ??????? ??????? ???? ?????? ?? ??????? ???? ???? ??? ?? ?????? ???, ??????? ?????? ????? ?? ??????? ???? ?? ??? ????? assumed ??? ?? ??? ????? assumption ??? ?? ??? ?? ????? ??????? ??? ??? ?????? ?? ????? ???? off-line. ???????? ?????? considers ??????? ????, ??? ???? ?? ????? ??????? ?? ??? ??????? ???? ???? ?? ???? ?????? ????? ?? ??????? ???? ?? ??? ????? ??? ??? ??? circumstance ?????????? ?????? ??????? ???? ???? ?? ???????? ?????? ??? ???? ?????? ?????? ???? ???? ??? ?? ?? ???? ???? ?????? reportable ???? ?? ??? ????????? spooling ?? ?????? ????? ??????????? ????? ???? ?? ??? ?????? ?? ?? ???

???? ????? ??????? ?? ?????? ????????

?? ?????? premise ???? ???? ????? ??????? ?? ?????? ?? ??? ????? ?? ??? ??? ???? ?????? ??: ????? ??????? ?? ??? ??? ?????? ????? ?? ????? ?? ??? ?????? ?? ?????? ???? ????? This is the only time the state of the printer is reported by the port monitor. In addition, the most meaningful information may be reported in the status members of aJOB_INFOstructure for that particular print job because some port monitor will have set these values directly.

TheJOB_INFOstructures contain a??????member and apStatusmember. Both members contain status information of a print job reported by the port monitor. These two members differ in that the??????member is a bit field of states that contains predetermined values, while thepStatusmember is a pointer to a string that could contain just about anything. These values are documented by the Win32 SDK and the WinSpool.h header file. ThepStatusmember is sometimes, but not always, set to a descriptive status string. The contents of this string are defined by each port monitor.

JOB_INFOstructures are returned by two API functions: GetJob and EnumJobs. EnumJobs returns an array ofJOB_INFO??? ???? ???? ?????? ??????? ???? ??? ?? ????? ????? ???????? ?? ???? ????????? ?? (??????) ??? despooling ?????? ????? ??? ?????? ??????? ??? ????? ?? ??? ?? ????? ??? ????, ???? ?? ???JOB_INFO????? ?????? ????? ?? JOB_STATUS_PRINTING ?????? ????? ?????? ?? ??? ???????? ??? ??? ???

??????? ?????? ???????? ?? ??? ?? ???? ???? ?? ?? ?????? ?? ????? ?? ???? ???? ?? ??? ???PRINTER_INFO?????? ??? ?? ?????? ?????? ???? ??? ??GetPrinter?????? ?? ??? ???? ???.. ?? ?? approach ???? ?? ??? ??? disadvantage ?? ?? ????pStatus???????? ????? ?? ??? ??PRINTER_INFO?????? ?? ???? ??????? ?? ??????? ?????? ??????? ?????? ?? ???? ??? ???????, ?? ??? ??? ?? ??? ????? ?????? ?? ??? ??? ???? ??????? ??????? ?? ?????? ?????PRINTER_INFO?????? ??? ????? ????, ??? ??, ?? Windows ?? ??? ??????? ????? ?????? ????? ?? ??? ???? ?? ????PRINTER_STATUS_ERROR??? ??????? ?????? ????? ????

????? ??? ?? ???????? ?? ?? ?? ??? ?? ?????? ?? ??????? ?? strictly ????? ??????? ?? ??????? ???? ?? ?? ?????? ??????? ?? ???? ??? ?????? ?? ???, ?????? ?? ?????PRINTER_INFO???????? ?? ??? ???? ?? ???? ??PRINTER_STATUS_PAUSED??,PRINTER_STATUS_PENDING_DELETION, ?? strictly ?????? ?????? ?? ??????? ???? ??? ??, ?????? ?? ?????JOB_INFO?????? ?? ??? ??? ?? ?????? ??? ?? ???? ??JOB_STATUS_PAUSED??,JOB_STATUS_DELETING, ?? ???? ?? ????? ?????? ????? ???? ?? ??? ????????? ???? ???, ??, ?? ?????? ????? ?? ???? ?? accumulate ?????? ???? ??? ?? despooled ?? ?? ?? ?????? ?? ??? ???? ???? ?? ???JOB_STATUS_PRINTED.

???????? ?? ?????? ??? ?????? ??????? ?? ??????? ?? ??? ??? ??????? ????? ?? ???????? ??? ?? ????? ?? ??????? ?? ??OpenPrinter??????, ?? ??????? ?? ??? ???? ??? ???????? ?? ??????? ???? ??? ??? ?? ??? ?? ???? ?? ?? ??????? ??????? ?? ?? ???? UNC ??? ?? ???? ??????? ??????? ?? ???? ?????

????????? ???? ?? ????? ????? ??? ?? ??? ???? ?? ??? ???? ????EnumJobs??????? ???? ?? ??? ??? ?? ??????JOB_INFO???????? ?? ??? ???? ?? ??? ???? ????GetPrinter?????? ?? ??????? ???? ?? ???PRINTER_INFO????????:

????? ???

   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 ?? ??????? ???? ?? ?? ?? ?????? ??????? ?????? ?? ????? ??? ?? circumstance ?? ????? ???? ???

??????

???????? ??????? ?? ??? ??????? ????????? ?? ???? ??? Win32 ?????? ?????? ?? ??? ???? ??, Microsoft ???????? ??? ???? ????? ?? ??? ????? ???? ?????? ?? ????? ????:
158828??? Wind32 ?????? ??? APIs ???? ???? ??? ??

???

???? ID: 160129 - ????? ???????: 02 ?????? 2010 - ??????: 3.0
???? ???? ???? ??:
  • 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
??????: 
kbfaq kbhowto kbmt KB160129 KbMthi
???? ?????? ????????
??????????: ?? ???? ?? ???? ??????? ?? ????? ?? Microsoft ????-?????? ?????????? ?????? ?????? ???? ??? ??. Microsoft ???? ??? ????-???????? ?? ????-???????? ????? ?????? ?? ???? ???????? ???? ?? ???? ????? ????? ??? ?? ??? ?????? ?? ???? ???? ???? ??? ????? ??. ???????, ????-???????? ???? ????? ???? ???? ???? ???. ?????, ????????, ?????-???? ?? ??????? ?? ???????? ?? ???? ???, ???? ?? ??? ?????? ???? ???? ??? ????? ??? ?? ???? ??. Microsoft ??????? ??? ???? ?? ?????? ?? ??????????, ????????? ?? ??? ?????? ?? ???? ????? ?? ???? ???????? ?? ??? ???? ????? ?? ??? ????????? ???? ??. Microsoft ????-?????? ?????????? ?? ????? ?????? ?? ?? ??? ??.
?????????? ?? ??????? ????????? ??????? ??:160129

??????????? ???

 

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