4

我正在尝试使用 esc/p 命令(EPSON TM-T70)直接打印到打印机,而不使用打印机驱动程序。代码在这里找到。

但是,如果我尝试打印任何字符串,它们会被截断。例如:

MyPrinter := TRawPrint.Create(nil);
try
  MyPrinter.DeviceName := 'EPSON TM-T70 Receipt';
  MyPrinter.JobName := 'MyJob';
  if MyPrinter.OpenDevice then
  begin
    MyPrinter.WriteString('This is page 1');
    MyPrinter.NewPage;
    MyPrinter.WriteString('This is page 2');
    MyPrinter.CloseDevice;
  end;
finally
  MyPrinter.Free;
end;

只会打印“This isThis is”!我通常不会MyPrinter.NewPage用来发送换行命令,但无论如何,它为什么会截断字符串?

在 RawPrint 单元WriteString函数中还要注意:

Result := False;
if IsOpenDevice then begin
  Result := True;
  if not WritePrinter(hPrinter, PChar(Text), Length(Text), WrittenChars) then begin
    RaiseError(GetLastErrMsg);
    Result := False;
  end;
end;

如果我在此处设置断点并单步执行代码,则WrittenChars设置为 14,这是正确的。为什么会这样?

4

2 回答 2

4

您正在使用支持 unicode 的 Delphi 版本。字符长 2 个字节。当您调用函数时,Length(s)您正在发送字符数,但该函数可能需要缓冲区的大小。将其替换为SizeOf(s) Length(s)*SizeOf(Char)

由于一个 unicode char 的大小正好是 2 个字节,当您在Length需要缓冲区大小时发送时,您实际上是在告诉 API 只使用一半的缓冲区。因此,所有字符串都大致分成两半。

于 2011-05-09T07:33:55.643 回答
4

也许您可以使用 ByteLength 函数,它以字节为单位给出字符串的长度。

于 2011-05-09T07:57:04.263 回答