【问题标题】:Controlling & Logging Printer Activities in Windows Operating System在 Windows 操作系统中控制和记录打印机活动
【发布时间】:2012-01-20 07:13:36
【问题描述】:

我们在没有域控制器的网络 (LAN) 设置中连接了几台打印机。打印机被赋予特定的 IP 地址。我希望将所有打印机活动记录到数据库(或文件系统)。我还想控制打印机,例如,如果任何用户(来自 IP 地址)希望横向打印,但我的打印机配置为仅纵向打印,则打印机应拒绝打印。另一个例子是如果用户超过了打印限制(页数),打印机不应该打印下一页。

我不知道要实现这一点。请提出您宝贵的建议。代码sn-ps,欢迎提出意见。

【问题讨论】:

    标签: c++ c windows-7 com lan


    【解决方案1】:

    请查看 MSDN 上的 Print Spooler API 函数:http://msdn.microsoft.com/en-us/library/dd162861(v=VS.85).aspx

    如何正确调用 Win32 后台处理程序枚举 API:http://support.microsoft.com/kb/158828

    如何获取打印机和打印作业的状态:http://support.microsoft.com/kb/160129

    示例代码:

     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;
    
           }
    

    【讨论】:

    • 嗨@Michael 非常感谢您提供这些信息。我希望记录所有打印机活动并控制打印机作业。请帮助我实现这一目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2011-04-18
    • 2018-07-08
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多