2014-09-06 102 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