Àêæàí â ñåòè - Íà óðîâåíü ââåðõ(API) Êàê ìíå îòïðàâèòü íà ïðèíòåð ÷èñòûé ïîòîê äàííûõ?

Ïîä Win16 Âû ìîæåòå èñïîëüçîâàòü ôóíêöèþ SpoolFile, èëè Passthrough escape, åñëè ïðèíòåð ïîääåðæèâàåò ïîñëåäíåå.

Ïîä Win32 Âû ìîæåòå èñïîëüçîâàòü WritePrinter.

Íèæå ïðèìåð îòêðûòèÿ ïðèíòåðà è çàïèñè ÷èñòîãî ïîòîêà äàííûõ â ïðèíòåð.

Ó÷òèòå, ÷òî Âû äîëæíû ïåðåäàòü êîððåêòíîå èìÿ ïðèíòåðà, òàêîå, êàê "HP LaserJet 5MP", ÷òîáû ôóíêöèÿ ñðàáîòàëà óñïåøíî.

Êîíå÷íî, Âû ìîæåòå âêëþ÷àòü â ïîòîê äàííûõ ëþáûå íåîáõîäèìûå óïðàâëÿþùèå êîäû, êîòîðûå ìîãóò ïîòðåáîâàòüñÿ.

uses WinSpool;

procedure WriteRawStringToPrinter(PrinterName:String; S:String);
var
  Handle: THandle;
  N: DWORD;
  DocInfo1: TDocInfo1;
begin
  if not OpenPrinter(PChar(PrinterName), Handle, nil) then
  begin
    ShowMessage('error ' + IntToStr(GetLastError));
    Exit;
  end;
  with DocInfo1 do
  begin
    pDocName := PChar('test doc');
    pOutputFile := nil;
    pDataType := 'RAW';
  end;
  StartDocPrinter(Handle, 1, @DocInfo1);
  StartPagePrinter(Handle);
  WritePrinter(Handle, PChar(S), Length(S), N);
  EndPagePrinter(Handle);
  EndDocPrinter(Handle);
  ClosePrinter(Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WriteRawStringToPrinter('HP', 'Test This');
end;

(Borland/Inprise FAQ N714, ïåðåâåäåí Àêæàíîì Àáäóëèíûì)


Ïîñìîòðè è äîäåëàé êàê òåáå íàäî.

unit TextPrinter;

interface

uses
  Windows, Controls, Forms, Dialogs;

type
  TTextPrinter = class(TObject)
  private
    FNumberOfBytesWritten: Integer;
    FHandle: THandle;
    FPrinterOpen: Boolean;
    FErrorString: PChar;
    procedure SetErrorString;
  public
    constructor Create;
    procedure Write(const Str: string);
    procedure WriteLn(const Str: string);
    destructor Destroy; override;
  published
    property NumberOfBytesWritten: Integer read FNumberOfBytesWritten;
  end;

implementation

{TTextPrinter}

constructor TTextPrinter.Create;
begin
  FHandle := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ
    or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if FHandle = INVALID_HANDLE_VALUE then
  begin
    SetErrorString;
    raise Exception.Create(FErrorString);
  end
  else
    FPrinterOpen := True;
  end;

procedure TTextPrinter.SetErrorString;
begin
  if FErrorString <> nil then
  LocalFree(Integer(FErrorString));
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
    nil,
    GetLastError(),
    LANG_USER_DEFAULT,
    @FErrorString,
    0,
    nil
    );
end;

procedure TTextPrinter.Write(const Str: string);
var
  OEMStr: PChar;
  NumberOfBytesToWrite: Integer;
begin
  if not FPrinterOpen then
    Exit;
  NumberOfBytesToWrite := Length(Str);
  OEMStr := PChar(LocalAlloc(LMEM_FIXED, NumberOfBytesToWrite + 1));
  try
    CharToOem(PChar(Str), OEMStr);
    if not WriteFile(FHandle, OEMStr^, NumberOfBytesToWrite,
      FNumberOfBytesWritten, nil) then
    begin
      SetErrorString;
      raise Exception.Create(FErrorString);
    end;
  finally
    LocalFree(Integer(OEMStr));
  end;
end;

procedure TTextPrinter.WriteLn(const Str: string);
begin
  Self.Write(Str);
  Self.Write(#10);
end;

destructor TTextPrinter.Destroy;
begin
  CloseHandle(FHandle);
  if FErrorString <> nil then
    LocalFree(Integer(FErrorString));
end;

end.

P.S.  ïðèíöèïå, âìåñòî LPT1 ìîæåò ñòîÿòü ÷òî óãîäíî, äàæå ñåòåâîé ñåðâåð ïå÷àòè (\\server\prn) - âñå ðàâíî ïå÷àòàåò. Ìîæíî è ïàðàìåòð â êîíñòðóêòîð âñòàâèòü è ò.ä.

Oleg Yunets

(2:451/300.24)