在我的应用程序中,所有打印机都使用printer.printers
命令列出。这仅列出打印机名称。选择后,它被保存在数据库中。
稍后,使用该AssignFile
函数将此打印机名称分配给文本文件。打印是使用Rewrite
功能完成的。
如果我将所选打印机保存\\PCname\printer name
在数据库中,然后将其与Rewrite
函数一起使用,则它可以工作。
但是如果我们只在数据库中保存打印机名称,那么打印就不会发生。是否需要保存\\PCname\printer name
路径?或者有没有其他解决方案。
除了使用 Pascal 文件访问功能进行打印之外,另一种方法是使用 Windows API 进行后台处理程序。
function PrintWithSpooler(const Name: string; const Data: AnsiString): integer;
var
hPrinter: THandle;
DocInfo: TDocInfo1;
bSuccess: boolean;
dwBytesWritten: DWORD;
begin
result := S_OK;
bSuccess := false;
DocInfo.pOutputFile := nil;
DocInfo.pDatatype := 'RAW';
DocInfo.pDocName := 'Label';
if OpenPrinter(PChar(Trim(Name)), hPrinter, nil) then
begin
try
if StartDocPrinter(hPrinter, 1, @DocInfo) > 0 then
begin
try
if StartPagePrinter(hPrinter) then
begin
try
bSuccess := WritePrinter(hPrinter, Pointer(Data), Length(Data), dwBytesWritten);
finally
EndPagePrinter(hPrinter);
end;
end;
finally
EndDocPrinter(hPrinter);
end;
end;
finally
ClosePrinter(hPrinter);
end;
end;
if not bSuccess then
begin
result := GetLastError;
// in case there was no error from GetLastError
if result = S_OK then
result := S_FALSE;
end;
end;