这个功能看起来挺奇葩的, 写这个是因为有客户在使用驱动连接票据打印机, 但是又要开钱箱, 驱动里只能每张单据都开钱箱, 而这个打印机又不是只打印结帐单

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

票据打印机一般都支持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_;
nDataLength: DWORD;
nSize: DWORD;
nReturn: Boolean;
begin
Result := False; AErrCode := ;
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[]), 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 := ;
if StartDocPrinter(nD, , @nDocInfo) <= then
Exit;
AErrCode := ;
if not StartPagePrinter(nD) then
Exit;
AErrCode := ;
nDataLength := Length(AData);
nReturn := WritePrinter(nD, PChar(AData), nDataLength, nSize);
if (not nReturn) or (nSize <> nDataLength) then
Exit;
AErrCode := ;
if not EndPagePrinter(nD) then
Exit;
AErrCode := ;
if not EndDocPrinter(nD) then
Exit; AErrCode := ;
if not ClosePrinter(nD) then
Exit; AErrCode := ;
Result := True;
end;

附: 获取驱动打印机状态:

var
i: Integer;
nPRH: THandle;
PrinterName:String;
nBuff: array[..] of Char;
nSize: DWord;
pInfo: PPrinterInfo2;
begin
Memo1.Lines.Clear;
for i := to Printer.Printers.Count - do
begin
if OpenPrinter(PChar(Printer.Printers[i]), nPRH,nil) then
begin
if GetPrinter(nPRH, , @nBuff, SizeOf(nBuff), @nSize) then
begin
pInfo:=PPrinterInfo2(@nBuff);
Memo1.Lines.Add('Device := ' + Printer.Printers[i]);
Memo1.Lines.Add('Status := ' + inttostr(pInfo.Status));
Memo1.Lines.Add('');
end;
end;
ClosePrinter(nPRH);
end;
end;

通过驱动向打印机发送一段(ESC)控制指令的更多相关文章

  1. TCP连接建立系列 — 客户端发送SYN段

    主要内容:客户端调用connect()时的TCP层实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd connect的TCP层实现 SOCK_STRE ...

  2. TCP连接建立系列 — 服务端发送SYNACK段

    本文主要分析:服务器端如何构造和发送SYNACK段. 内核版本:3.6 Author:zhangskd @ csdn blog 发送入口 tcp_v4_send_synack()用于发送SYNACK段 ...

  3. c# 向驱动打印机发送命令打开钱箱

    引用的dll 链接: https://pan.baidu.com/s/1MjwmfvBCPTBq1QNapKzDmg 提取码: 9wuf [DllImport("Drawcash.dll&q ...

  4. Laravel5.5 邮件驱动使用 SMTP 驱动实现邮件发送

    laravel5.5 邮件驱动 Laravel 支持多种邮件驱动,包括 smtp.Mailgun.Maildrill.Amazon SES.mail 和 sendmail.Mailgun . Mail ...

  5. 【转】C#使用ESC指令控制POS打印机打印小票

    .前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的pos ...

  6. C#使用ESC指令控制POS打印机打印小票

    1.前言 C#打印小票可以与普通打印机一样,调用PrintDocument实现.也可以发送标注你的ESC指令实现.由于 调用PrintDocument类时,无法操作使用串口或TCP/IP接口连接的po ...

  7. usb口打印机的指令打印和驱动打印

    打印机简介:是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上. 打印机类型:激光打印机.喷墨打印机.针式打印机.热敏打印机等. 计算机和打印机之间的连接方式:usb口.串口.并口.网口.蓝 ...

  8. ADO.NET 中可以发送包含多个SQL语句的批处理脚本到SQL Server,但是用MySQL的ODBC驱动不行

    众所周知,我们在ADO.NET中可以使用NuGet包System.Data.SqlClient来操作SQL Server,并且ADO.NET是支持向SQL Server发送包含多个SQL语句的批处理脚 ...

  9. XP中如何配置和共享打印机

    Win XP中如何配置和共享打印机                一.配置  打印机 在"控制面板"打开"打印机和传真",在左边的选项或单击右键选择" ...

随机推荐

  1. 如何重启Cloudera Manager?

    为什么重启: 突然发现ClouderaManager的webui访问不了了…… 我使用netstat看了一下我的webui监听端口,发现尼玛N多CLOSE_WAIT,网上查了一下是Socket关闭有问 ...

  2. Scala中的match(模式匹配)

    文章来自:http://www.cnblogs.com/hark0623/p/4196261.html   转载请注明 代码如下: /** * 模式匹配 */ case class Class1(pa ...

  3. SU suspecfk命令学习

    用suplane生成平面,并查看其FK谱, 水平反射界面经FK变换后,波数为0, 正好处于临界,乃奎斯特频率, 有空间假频, Over,不足之处,欢迎批评指正.

  4. AngularJS学习笔记一:简单入门

    阿里云网站的前端是AngularJS实现的. 先下载AngularJS的开发工具包,我下载的angular-1.4.0. 在合适位置引入js文件: <script src="angul ...

  5. 浅谈MySQL索引背后的数据结构及算法

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. 打造离线使用的Mobile Web App

    最近公司举办技术大赛,我和同事一起制作了一个叫做10K Hours的Mobile Web App,可以帮助你通过一万小时的努力,成为某个领域的专家.正好前段时间翻译了一本书<HTML5 Mobi ...

  7. silverlight 跨域访问 wcf

    先介绍一下我的测试项目,我用flash和silverlight一同来调用一个webservice,一个flash客户端,一个silverlight客户端,一个web项目来host flash和silv ...

  8. ashx 集成于Ihandle 简易 高性能 web

    不用搞MV4..如果你用.ashx写的后台..自己加一个switch case就实现了路由...更方便,还不用配置   scaffold 不是dynamic data里面的东西吗   现在我全是ash ...

  9. 使用STL map 用 string 做索引 插入删除数据

    1.代码 #include <map> #include <string> #include <stdio.h> #include <vector> # ...

  10. jsp页面中的代码执行加载顺序介绍

    1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. j ...