Delphi 有没有办法在没有打印机的情况下向打印机发送命令。BeginDoc/EndDoc?

Delphi 有没有办法在没有打印机的情况下向打印机发送命令。BeginDoc/EndDoc?,delphi,printing,Delphi,Printing,我有一台HP收据打印机A799,它连接并控制一个抽屉 如果有任何打印信号发送到打印机,打印机将发送信号打开抽屉。 有两个问题 第一个问题: ExtEscape(Printer.Handle, PASSTHROUGH, SizeOf(BufferIN), @BufferIn, 4, @BufferOut) 如果我在程序中添加了Printer.BeginDoc和Printer.EndDoc,我可以成功地向打印机发送命令。(我尝试向打印机发送测试打印请求,成功) 但问题是,当我尝试发送查询命令(如询

我有一台HP收据打印机A799,它连接并控制一个抽屉 如果有任何打印信号发送到打印机,打印机将发送信号打开抽屉。 有两个问题

第一个问题:

ExtEscape(Printer.Handle, PASSTHROUGH, SizeOf(BufferIN), @BufferIn, 4, @BufferOut)
如果我在程序中添加了Printer.BeginDoc和Printer.EndDoc,我可以成功地向打印机发送命令。(我尝试向打印机发送测试打印请求,成功)

但问题是,当我尝试发送查询命令(如询问打印机发送抽屉状态)时,它也会将纸张送入一行并打开抽屉

此操作的原因是Printer.BeginDoc和Printer.EndDoc?我试图从我的代码中删除它们,但当我现在向打印机发送任何命令时,打印机和抽屉将不会执行任何操作

第二个问题:

ExtEscape(Printer.Handle, PASSTHROUGH, SizeOf(BufferIN), @BufferIn, 4, @BufferOut)
缓冲输入和缓冲输出也是PChar 我使用此功能带到打印机,我已尝试此功能正在工作(尝试测试打印)

我试图将查询命令发送到打印机,但在缓冲输出没有得到任何返回之后,它仍然是一个空PChar


有人有什么解决办法吗?

我会回答你的第一个问题-第二个问题应该转移到这里的另一个帖子,作为一个单独的问题提问

您可以直接使用(从WinSpool.pas单元)将内容发送到打印机,而无需使用BeginDoc/EndDoc。下面是一个将文件直接打印到打印机的示例(几年前由TeamB的Peter Down在一个旧的Borland/CodeGear Delphi论坛上发布):

下面是一个读取我发现的打印机状态的示例(同样是TeamB的Peter Lower)——它是在Delphi 2007中测试的,因此可能需要对Delphi的更高版本的某些类型进行一些小的调整:

Uses WinSpool;

function GetCurrentPrinterStatus: DWORD;
var
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port   : array[0..255] of char;
  hDeviceMode: THandle;
  bytesNeeded, bytesWritten: Cardinal;
  pPI: PPrinterInfo2;
  Defaults: TPrinterDefaults;
begin
  Assert( Printer.PrinterIndex >= 0 );
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  FillChar( Defaults, Sizeof(Defaults), 0 );
  Defaults.DesiredAccess:= 
    PRINTER_ACCESS_ADMINISTER or PRINTER_ACCESS_USE;
  Win32Check(WinSpool.OpenPrinter(@Device, hPrinter, @Defaults ));
  try
    WinSpool.GetPrinter(
      hPrinter,
      2,
      Nil, 0, @bytesNeeded );
    GetMem( pPI, bytesNeeded );
    try
      Win32Check(WinSpool.GetPrinter(
        hPrinter, 2,
        pPI, bytesNeeded, @bytesNeeded ));
      Result := pPI^.Status;
    finally
      FreeMem( pPI );
    end;
  finally
    WinSpool.ClosePrinter( hPrinter );
  end;
end;
API文档为您提供了有关其返回的标记的更多信息。您可以使用以下内容检查特定标志:

if (Status and PRINTER_STATUS_ERROR) <> 0 then
  // Printer is in error status
如果(状态和打印机状态错误)为0,则
//打印机处于错误状态

我只想知道您在这段代码中使用的单位,因为没有找到类型TDoc\u Info\u 1,也没有找到打印机。@Oussaki:
TDoc\u Info\u 1
WinSpool
中(在我的代码中,这两个块都显示-请参见每个块的第一行),
Printer
Printers
中,所有标准Delphi打印机代码的位置。好的,类型(TDoc_Info_1)在较新版本的Delphi中更改了,至少我使用的是XE7,所以更改为TDocInfo1。