检测打印机

来源:互联网 发布:sql应用开发参考手册 编辑:程序博客网 时间:2024/06/10 06:20

//是大富翁上看到的,觉得有用

//设计: Linc 2004.04.29
//功能: 判断打印机是否就绪
//参数:允许是网络打印机

function IsPrinterReady: Boolean;
var
  hDeviceMode, hGlobal, hPrinter: THandle;
  dwNeeded: DWord;
  pDefs: TPrinterDefaults;
  pInfo: PPrinterInfo2;
  bFlag: Boolean;
  cDevice,
  cDriver,
  cPort: array[0..255] of char;
begin
  Result := False;
  if Printer = nil then Exit;
  if Printer.PrinterIndex = -1 then Exit;
  hGlobal := 0;
  try
    Printer.GetPrinter(cDevice, cDriver, cPort, hDeviceMode);
    if hDeviceMode = 0 then Exit;

    FillChar(pDefs, SizeOf(TPrinterDefaults), 0);
    pDefs.DesiredAccess := {STANDARD_RIGHTS_REQUIRED or} PRINTER_ACCESS_USE;
    bFlag := OpenPrinter(cDevice, hPrinter, @pDefs);
    dwNeeded := GetLastError;
    if not bFlag or (hPrinter = INVALID_HANDLE_VALUE) then Exit;

    FillChar(pInfo, SizeOf(pInfo), #0);
    WinSpool.GetPrinter(hPrinter, 2, nil, 0, @dwNeeded);
    if dwNeeded = 0 then Exit;

    hGlobal := GlobalAlloc(GHND, dwNeeded);
    if hGlobal = 0 then Exit;

    pInfo := PPrinterInfo2(GlobalLock(hGlobal));
    if pInfo = nil then Exit;

    bFlag := WinSpool.GetPrinter(hPrinter, 2, pInfo, dwNeeded, @dwNeeded);
    if bFlag then
      Result := pInfo.Status = 0
    else Result := False;
  finally
    if pInfo <> nil then GlobalUnlock(hGlobal);
    if hGlobal <> 0 then GlobalFree(hGlobal);
    if hPrinter <> 0 then ClosePrinter(hPrinter);
  end;
end; 

原创粉丝点击