使用PRINTER_OPTION_NO_CACHE正确实现OpenPrinter2

时间:2014-09-06 02:03:40

标签: delphi winapi printing delphi-xe2

我正在修改一些使用OpenPrinter代替使用OpenPrinter2的现有代码。它包含一个参数PPRINTER_OPTIONS,它在Delphi中封装为TPrinterOptions,定义如下:

_PRINTER_OPTIONSW = record
  cbSize: Cardinal;
  dwFlags: DWORD;
end;

我无法理解如何使用此结构来封装标志PRINTER_OPTION_NO_CACHE,我甚至无法在任何现有的VCL / RTL中找到该常量。

var
  PD: TPrinterDefaults;
  PO: TPrinterOptions;
begin
  PO.dwFlags:= ???
  if OpenPrinter2(ADevice, @FPrinterHandle, @PD, @PO) then begin
    ...

我在寻找Delphi实现OpenPrinter2TPrinterOptions时没有太多运气。如何让PRINTER_OPTION_NO_CACHE工作?

修改

这是对的吗?

const
  PRINTER_OPTION_NO_CACHE = 0;
  PRINTER_OPTION_CACHE = 1;
  PRINTER_OPTION_CLIENT_CHANGE = 2;

...

  PO.dwFlags:= PRINTER_OPTION_NO_CACHE;

1 个答案:

答案 0 :(得分:2)

MSDN文档说:

typedef enum tagPRINTER_OPTION_FLAGS { 
  PRINTER_OPTION_NO_CACHE,
  PRINTER_OPTION_CACHE,
  PRINTER_OPTION_CLIENT_CHANGE
} PRINTER_OPTION_FLAGS;

这里声明的C enum实际上只是int。第一个枚举值为0,下一个为1,依此类推。

但是头文件讲的是另一个故事,与文档相矛盾。头文件说:

typedef enum _PRINTER_OPTION_FLAGS
{
    PRINTER_OPTION_NO_CACHE       = 1 << 0,
    PRINTER_OPTION_CACHE          = 1 << 1,
    PRINTER_OPTION_CLIENT_CHANGE  = 1 << 2,
    PRINTER_OPTION_NO_CLIENT_DATA = 1 << 3,
} PRINTER_OPTION_FLAGS;

所以就像这样翻译成Pascal。

const
  PRINTER_OPTION_NO_CACHE = 1;
  PRINTER_OPTION_CACHE = 2;
  PRINTER_OPTION_CLIENT_CHANGE = 4;
  PRINTER_OPTION_NO_CLIENT_DATA = 8;

像这样填写记录:

var
  Options: TPrinterOptions;
....
Options.cbSize := SizeOf(Options);
Options.dwFlags := PRINTER_OPTION_NO_CACHE;