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