Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6957685
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T15:02:19+00:00 2026-05-27T15:02:19+00:00

We have few printers connected in the network (LAN) setup with no domain controller.

  • 0

We have few printers connected in the network (LAN) setup with no domain controller. The printers are given specific IP addresses. I wish to log all the printer activities to a database (or file-system). Also I want to control the printers, for example, if any user (from a IP address) wishes to print in landscape but one my printers is configured only for printing in portrait, the printer should reject the print. Another example is that if a user has exceeded the print limit (number of pages), the printer should not print the next page.

I have no idea of achieving this. Kindly give your valuable suggestions. Code snippets, ideas are most welcome.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T15:02:20+00:00Added an answer on May 27, 2026 at 3:02 pm

    Please check out the Print Spooler API Functions over at MSDN: http://msdn.microsoft.com/en-us/library/dd162861(v=VS.85).aspx

    How To Call Win32 Spooler Enumeration APIs Properly: http://support.microsoft.com/kb/158828

    How to get the status of a printer and a print job: http://support.microsoft.com/kb/160129

    Sample Code:

     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;
    
           }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

In almost all of my projects I have few files that are project wide
I have a few local variables and I want to divide them all divide
Setup I have a few questions about the default argument promotions when calling a
When insert/updating an entity I need to log all the properties that have changed.
suppose I have a class with many explicit (statically allocated) members and few pointers
I have few asynchronous tasks running and I need to wait until at least
I have few different applications among which I'd like to share a C# enum.
I have few question in this regard When you create an internet page, does
We have few components like libraries dlls When initially created I ran the following
I have few nested DIVs at page. I want to add event only for

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.