Ошибка печати команды печати в кодировке base64 с использованием термопринтера

У меня есть приложение, которое получает команду печати и декодирует ее. Я сохраняю команду печати в текстовом файле. А затем прочитать его в байтовом массиве. Декодированная строка также содержит часть изображения, отображаемую в виде ненужных символов. Когда я пытаюсь отправить байтовый массив на принтер с помощью функции 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 ответ

Решение

Это выглядит как 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;
Другие вопросы по тегам