Вот такая штука у меня работает без проблем:
| Код | function GetPrinterStatus(const APrinterIndex: Integer): DWORD; var APrinterHandle: THandle; APrinterInfo: PPrinterInfo2; ABytesNeeded: DWORD;
function GetPrinterHandle: THandle; const PrinterDefaults: TPrinterDefaults = (pDatatype: nil; pDevMode: nil; DesiredAccess: PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER);
var ADevice, ADriver, APort: array [0. MAX_PATH] of Char; hDeviceMode: THandle; begin Printer.GetPrinter(ADevice, ADriver, APort, hDeviceMode); if not OpenPrinter(@ ADevice, Result, @ PrinterDefaults) then RaiseLastOSError; end;
begin Result: = 0; APrinterHandle: = 0; try Printer.PrinterIndex: = APrinterIndex; APrinterHandle: = GetPrinterHandle; ABytesNeeded: = 0; if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ ABytesNeeded) then if Windows.GetLastError and ERROR_INSUFFICIENT_BUFFER then RaiseLastOSError; GetMem(APrinterInfo, ABytesNeeded); try if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ ABytesNeeded) then RaiseLastOSError; Result: = APrinterInfo ^.Status; finally FreeMem(APrinterInfo); end; except on E: Exception do begin if APrinterHandle <> 0 then ClosePrinter(APrinterHandle); raise; end; end; end;
|
PS: а вот мой пример, писал в том году - работает под Win 7\XP на Delphi XE3: http://codes-sources.commentcamarche.net/source/100256-surveillance-print-spooler-via-winapi |