通过驱动向打印机发送一段(ESC)控制指令

开发收银系统时因为客户在使用驱动连接票据打印机, 但是又要开钱箱, 驱动里只能每张单据都开钱箱, 但是软件要求只有在结账时才开钱箱,

所以就需要用软件控制打印机开钱箱。

票据打印机一般都支持ESC/POS指令, 所以就出现了如下代码, 通过这个函数可以把ESC/POS指令里的开钱箱指令发送给打印机控制开钱箱,

同样, 也可以发送别的什么东西, 比如响响蜂鸣器之类的

 这个代码里使用的是默认打印机, 当然稍微改动下, 就可以先弹出个打印机列表, 然后选择打印机传进去, 这样就可以控制任意打印机了。

OpenPrinter(PChar(Printer.Printers[0]), nD, nPPD); 

 

uses
    WinSpool, Printers;


function WritePrtDataForDriver(AData: string; var AErrCode: Byte): Boolean;
var
  nD: Cardinal;
  nPPD: PPrinterDefaults;
  nDocInfo: DOC_INFO_1;
  nDataLength: DWORD;
  nSize: DWORD;
  nReturn: Boolean;
begin
  Result := False;

  AErrCode := 1;
  nD := INVALID_HANDLE_VALUE;
  nPPD := New(PPrinterDefaults);
  try
    with nPPD^ do
    begin
      DesiredAccess := PRINTER_ACCESS_USE;
      pDatatype := nil;
      pDevMode := nil;
    end;
    OpenPrinter(PChar(Printer.Printers[0]), nD, nPPD);
  finally
    Dispose(nPPD);
  end;
  if nD = INVALID_HANDLE_VALUE  then
    Exit;

  with nDocInfo do
  begin
    pDocName := 'Print Document';
    pOutputFile := nil;
    pDatatype := 'RAW';
  end;
  AErrCode := 2;
  if StartDocPrinter(nD, 1, @nDocInfo) <= 0 then
    Exit;
  AErrCode := 3;
  if not StartPagePrinter(nD) then
    Exit;
  AErrCode := 4;
  nDataLength := Length(AData);
  nReturn := WritePrinter(nD, PChar(AData), nDataLength, nSize);
  if (not nReturn) or (nSize <> nDataLength) then
    Exit;
  AErrCode := 5;
  if not EndPagePrinter(nD) then
    Exit;
  AErrCode := 6;
  if not EndDocPrinter(nD) then
    Exit;

  AErrCode := 7;
  if not ClosePrinter(nD) then
    Exit;

  AErrCode := 0;
  Result := True;
end;

 

转载于:https://www.cnblogs.com/coorun/p/3462430.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值