>我有一个应用程序接收打印命令并对其进行解码。我将打印命令保存在文本文件中。然后在字节数组中读取它。解码的字符串还包含显示为垃圾字符的图像部分。当我尝试使用 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);
如果有人遇到任何类似的问题,如果我错过了什么,请告诉我。
注意:
- 我已经验证了解码输入打印命令时没有错误。
- 我使用德尔福4。
看起来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;