2014-09-06 104 views
1

我在修改一些使用OpenPrinter代替OpenPrinter2的代码。它包含一个参数PPRINTER_OPTIONS这在德尔福封装为TPrinterOptions,像这样定义的:使用PRINTER_OPTION_NO_CACHE正确实施OpenPrinter2

_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; 
+2

相反['this'](http://pastebin.com/sjt0G2f2)。 – TLama 2014-09-06 02:22:39

+0

@TLama啊所以这就是你如何封装Winapi枚举,呃? – 2014-09-06 02:23:33

+0

'cbSize'字段怎么样? – 2014-09-06 02:26:21

回答

2

MSDN文档这样说:

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

A C枚举,这里宣布,实际上只是一个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; 

因此,像这样转换为帕斯卡。

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; 
+0

嗨。您是否创建了使用OpenPrinter2的自定义Printers.pas,如果是这样,它会修复获取错误的问题。操作不支持选定的打印机? – Sigurdur 2014-10-10 11:54:29