读书人

window API GetPrinter 有关问题求解

发布时间: 2012-02-23 22:01:35 作者: rapoo

window API GetPrinter 问题求解。

Delphi(Pascal) code
unit Umain;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Buttons,winspool,Printers, ExtCtrls;type  TForm1 = class(TForm)    BitBtn2: TBitBtn;    LabeledEdit1: TLabeledEdit;    CheckBox1: TCheckBox;    procedure BitBtn2Click(Sender: TObject);    procedure CheckBox1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;type days=(sun,mon,tue,wed,thu,fri,sat);var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn2Click(Sender: TObject);var    pinfo: array[0..32] of _PRINTER_INFO_2a;    pprt,a: Cardinal;    b:DWORD;    MyPrinter,MyHandle       : THandle;    MyDevice,MyDriver,MyPort: array [0..255] of Char;begin    if CheckBox1.Checked then    begin        Printer().PrinterIndex := -1;        Printer().GetPrinter(MyDevice,MyDriver,MyPort,MyHandle);    end    else    begin        StrCopy(@MyDevice,PChar(LabeledEdit1.Text));    end;    if OpenPrinter(MyDevice,pprt,nil) then    begin        a:=sizeof(pinfo);        b:=84;        if getprinter(pprt,2,@pinfo,a,@b) then        begin            showmessage(pinfo[0].pPrinterName+' ststus:'+inttostr(pinfo[0].Status));            case pinfo[0].Status of                0:                              //PRINTER_STATUS_OK:                    showmessage('正常');                PRINTER_STATUS_PAUSED            :    // $00000001;                    showmessage('暂停');                PRINTER_STATUS_ERROR             :    // $00000002;                    showmessage('错误');                PRINTER_STATUS_PENDING_DELETION  :    // $00000004;                    showmessage('暂停');                PRINTER_STATUS_PAPER_JAM         :    // $00000008;                    showmessage('夹纸');                PRINTER_STATUS_PAPER_OUT         :    // $00000010;                    showmessage('暂停');                PRINTER_STATUS_MANUAL_FEED       :    // $00000020;                    showmessage('手动送纸');                PRINTER_STATUS_PAPER_PROBLEM     :    // $00000040;                    showmessage('纸张问题');                PRINTER_STATUS_OFFLINE           :    // $00000080;                    showmessage('脱机');                PRINTER_STATUS_IO_ACTIVE         :    // $00000100;                    showmessage('暂停');                PRINTER_STATUS_BUSY              :    // $00000200;                    showmessage('忙');                PRINTER_STATUS_PRINTING          :    // $00000400;                    showmessage('打印中');                PRINTER_STATUS_OUTPUT_BIN_FULL   :    // $00000800;                    showmessage('暂停');                PRINTER_STATUS_NOT_AVAILABLE     :    // $00001000;                    showmessage('无效');                PRINTER_STATUS_WAITING           :    // $00002000;                    showmessage('等待');                PRINTER_STATUS_PROCESSING        :    // $00004000;                    showmessage('处理');                PRINTER_STATUS_INITIALIZING      :    // $00008000;                    showmessage('正在初始化');                PRINTER_STATUS_WARMING_UP        :    // $00010000;                    showmessage('预热');                PRINTER_STATUS_TONER_LOW         :    // $00020000;                    showmessage('墨少');                PRINTER_STATUS_NO_TONER          :    // $00040000;                    showmessage('缺墨');                PRINTER_STATUS_PAGE_PUNT         :    // $00080000;                    showmessage('暂停');                PRINTER_STATUS_USER_INTERVENTION :    // $00100000;                    showmessage('用户干涉');                PRINTER_STATUS_OUT_OF_MEMORY     :    // $00200000;                    showmessage('超出内存');                PRINTER_STATUS_DOOR_OPEN         :    // $00400000;                    showmessage('门打开');                PRINTER_STATUS_SERVER_UNKNOWN    :    // $00800000;                    showmessage('不明服务');                PRINTER_STATUS_POWER_SAVE        :    // $01000000;                    showmessage('节能');               else showmessage('print end or no print');            end;        end        else        begin            showmessage(SysErrorMessage(GetLastError()));        end;        ClosePrinter(pprt);    end;end;procedure TForm1.CheckBox1Click(Sender: TObject);begin    LabeledEdit1.Enabled:=  not    CheckBox1.Checked;end;end. 


========================================
以上是网上摘抄的代码。编译没有问题,但是不知为何在我机器上打印机返回状态一直都是“正常”。
运行环境:winxp sp3,串口打印机。

[解决办法]
这个代码没用,原来研究过。
在MSDN上找到一个,不知道能用不:
MSDN搜索Get the Status of a Printer and a Print Job:
C/C++ 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))       {           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))               {                   return TRUE;               }           }       }       /*        *  No error condition.        */        return FALSE;   } 


[解决办法]
顶 up
[解决办法]

探讨

引用:
。。。。。给你贴的MSDN代码你都没看啊

人家问delphi,你给人家C++...

[解决办法]
看了LZ的代码突然想起一点,取得打印机的api是可以取得机器上多个打印机的,LZ是不是没取到正确的那个呢?例如取到的打印机是虚拟打印机或者网络打印机
[解决办法]
同意楼上,用pinfo[i]把所有的都试试,可以跟踪下看看名称是否都正确。
还有就是有个默认的打印机,打印时会用它来打印,但它可能不是排在第一个。
[解决办法]
打印机正常当然出来的结果是正常啦!

读书人网 >.NET

热点推荐