使用热敏打印机打印base64编码的打印命令时出错

时间:2012-05-15 11:55:14

标签: delphi delphi-4

我有一个接收打印命令并对其进行解码的应用程序。 我将print命令保存在文本文件中。然后在字节数组中读取它。 解码后的字符串还包含显示为垃圾字符的图像部分。 当我尝试使用 WritePrinter 函数将字节数组发送到打印机时,它返回False。 我尝试检查返回的错误代码 1784 ,但找不到有关此错误代码的任何信息以及可能发生的错误代码。

请在下面找到代码段:

AssignFile (decodedfile, st_path + '\Sample.txt');
reset(decodedfile);
SetLength(buffer, FileSize(decodedfile));
For i := 1 to FileSize(decodedfile) do
    Read(decodedfile, buffer[i - 1]);
CloseFile(decodedfile);
DocInfo.pDocName := pChar('Direct to Printer');
DocInfo.pOutput := Nil;
DocInfo.pDatatype := pChar('RAW');
PrinterName := cmbPrinters.Text;;
if not WinSpool.OpenPrinter(pChar(PrinterName), hPrinter, nil) then begin
   raise exception.create('Printer not found');
end;
If StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
    Abort;
try
    If not StartPagePrinter(hPrinter) then
        Abort;
    try
        If not WritePrinter(hPrinter, @buffer, Length(buffer), BytesWritten) then begin
            dError := GetLastError;
            ShowMessage(InttoStr(dError));
            Abort;
        end;
    finally
        EndPagePrinter(hPrinter);
    end;
finally
    EndDocPrinter(hPrinter);
end;
WinSpool.ClosePrinter(hPrinter);

如果有人遇到任何类似的问题,请告诉我是否遗漏了任何问题。

注意:

  1. 我已经确认解码输入打印命令没有错误。
  2. 我使用的是Delphi 4。

1 个答案:

答案 0 :(得分:1)

看起来buffer是一个动态数组。如果您已将变量的声明包含在其余代码中,那将非常有用。但是,我猜想它的类型是

buffer: array of Byte;

但您将@buffer传递给WritePrinter。这是指向数组第一个字节的指针的地址。

您只需将指针传递给第一个字节即可。像这样:

WritePrinter(..., Pointer(buffer), ...);

另外,加载文件的方式有点陈旧。可能更简单的是创建TMemoryStream并在其上调用LoadFromFile

stream := TMemoryStream.Create;
try
  stream.LoadFromFile(filename);
  ....
  if not WritePrinter(..., stream.Memory, stream.Size, ...) then
    ....
finally
  stream.Free;
end;