Показать сообщение отдельно
  #8  
Старый 16.05.2011, 13:47
kiman.ru kiman.ru вне форума
Новичок
 
Регистрация: 11.02.2010
Сообщения: 63
Репутация: 10
По умолчанию Код программы 2

Код:
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 := 1;
    APrinterHandle       := GetPrinterHandle;
    ABytesNeeded         := 0;

if not WinSpool.GetPrinter(APrinterHandle, 2, nil, 0, @ABytesNeeded) then
      if Windows.GetLastError <> ERROR_INSUFFICIENT_BUFFER then
        RaiseLastOSError;

    GetMem(APrinterInfo, ABytesNeeded);
    try
      if not WinSpool.GetPrinter(APrinterHandle, 2, APrinterInfo, ABytesNeeded, @ABytesNeeded) then
        RaiseLastOSError;
      Result := APrinterInfo^.Status;
    finally
      begin
      FreeMem(APrinterInfo);
      Form1.Caption := inttostr(APrinterInfo^.Attributes);
      end;
    end;
  except on E: Exception do
    begin
      if APrinterHandle <> 0 then
        ClosePrinter(APrinterHandle);
      raise;
    end;
  end;
end;
Ответить с цитированием