Delphi 使用文件重写功能打印

Delphi Printing using file rewrite function

在我的应用程序中,所有打印机都使用 printer.printers 命令列出。这仅列出打印机名称。选择后,它会保存在数据库中。

稍后,使用 AssignFile 函数将此打印机名称分配给文本文件。 打印是使用 Rewrite 函数完成的。

如果我在数据库中将选定的打印机保存为 \PCname\printer name,然后将其与 Rewrite 函数一起使用,那么它就可以工作了。

但是,如果我们只在数据库中保存打印机名称,则不会进行打印。 是否需要保存\PCname\printer name路径?或者有没有其他解决办法。

显然,您需要 PCname。可以按照你说的保存到数据库中,但是如果数据库是从多台PC使用的,就会出现问题,只能在数据库中保存打印机名称,并在使用打印机的PC上添加PCname。您可以使用 GetComputerName

获取 PCname

使用 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;