我正在修改一些使用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实现OpenPrinter2
或TPrinterOptions
时没有太多运气。如何让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;
答案 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;