在2000下调用api函数getprinter得到的结构PRINTER_INFO_2种只有两种状态PRINTER_STATUS_PAUSED 
PRINTER_STATUS_PENDING_DELETION
那2000下该怎么判断打印机是否缺纸?请高手帮忙啊

解决方案 »

  1.   

    可用CREATEFILE以PRN为文件名生成一个文件,检测返回值,若成功则打印机可用,否则显示打印机故障。生成关于PRN的文件句柄后,可象普通文件一样向文件写入内容,比如WRITE,写完后关闭文件。//从并行端口读取打印机状态function GetPrinterStatus:byte;asmMOV DX,$379;IN AL,DX;end;//获取打印机是否出错function CheckPrinter:boolean;vartemp:byte;begintemp:=GetPrinterStatus;Result:=not ( ((temp and $80)=0) //打印机忙or ((temp and $20)<>0) //打印机缺纸or ((temp and $10)=0) //打印机未联机or ((temp and $08)=0) ); //打印机出错;end;
      

  2.   

    function GetPrinterStatus:byte;asmMOV DX,$379;IN AL,DX;end;
    调用这个函数就出错
      

  3.   

    C++代码,不知道可不可以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; 
        PRINTER_INFO_2       *pPrinterInfo = NULL;
        JOB_INFO_2       *pJobStorage=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;   }
      

  4.   

    list print-jobs in a printer-queue? uses 
      Winspool, Printers; function GetCurrentPrinterHandle: THandle; 
    var 
      Device, Driver, Port: array[0..255] of Char; 
      hDeviceMode: THandle; 
    begin 
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode); 
      if not OpenPrinter(@Device, Result, nil) then 
        RaiseLastWin32Error; 
    end; function SavePChar(p: PChar): PChar; 
    const 
      error: PChar = 'Nil'; 
    begin 
      if not Assigned(p) then 
        Result := error 
      else 
        Result := p; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    type 
      TJobs  = array [0..1000] of JOB_INFO_1; 
      PJobs = ^TJobs; 
    var 
      hPrinter: THandle; 
      bytesNeeded, numJobs, i: Cardinal; 
      pJ: PJobs; 
    begin 
      hPrinter := GetCurrentPrinterHandle; 
      try 
        EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded, 
          numJobs); 
        pJ := AllocMem(bytesNeeded); 
        if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded, 
          bytesNeeded, numJobs) then 
          RaiseLastWin32Error;     memo1.Clear; 
        if numJobs = 0 then 
          memo1.Lines.Add('No jobs in queue') 
        else 
          for i := 0 to Pred(numJobs) do 
            memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s', 
              [SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument), 
              pJ^[i].Status, SavePChar(pJ^[i].pStatus)])); 
      finally 
        ClosePrinter(hPrinter); 
      end; 
    end;