为什么在使用直接打印时字符串会被截断?

| 我正在尝试使用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;
仅打印“这是这个”!我通常不使用
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,这是正确的。为什么会这样呢?     
已邀请:
您正在使用启用了unicode的Delphi版本。字符长度为2个字节。当您用
Length(s)
调用函数时,您正在发送的字符数是多少,但是该函数可能期望缓冲区的大小。将其替换为SizeOf(s)
Length(s)*SizeOf(Char)
。 由于一个Unicode字符的大小恰好是2个字节,因此当您需要缓冲区大小时发送“ 7”时,实际上是在告诉API仅使用缓冲区的一半。因此,所有字符串都大致分为两半。     
也许您可以使用ByteLength函数,该函数以字节为单位给出字符串的长度。     

要回复问题请先登录注册