2009-08-05 58 views
0

設置正確的打印機在MS Word我有以下自動化代碼:通過自動化

lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup); 
lPrintSetup.Printer := 'MyPrinter'; 
lPrintSetup.DoNotSetAsSysDefault := True; 
lPrintSetup.Execute; 
lPrintSetup := Null; 

Printer物業給我一些問題,有時Execute崩潰與EOleException(0x800A1460(錯誤代碼5216):有打印機錯誤),因爲一個錯誤的printername。

我通過EnumPrinters API調用獲取了_PRINTER_INFO_2記錄中的所有打印機的打印機信息。如果給出_PRINTER_INFO_2記錄中的信息,我怎樣才能爲Word編寫正確的printername?它至少與Windows 2000,Word 2000和Citrix一起工作。

一些背景資料:

我們的應用程序首先與自我構建的打印機名稱充滿了PRINTERNAME。這給Citrix客戶端帶來了問題,因此對於Citrix客戶端,我們採用了_PRINTER_INFO_2.pPortName並刪除了客戶端:#:部分。 這是爲我們的大多數客戶工作,但有時仍然顯示打印機錯誤。

我至今嘗試過(在Windows XP SP3,Word 2007中):

  • 只取_PRINTER_INFO_2.pPrinterName。問題在於,當您有意修改printernames(將'PDFCreator'重命名爲'MYPC上的HP DESKJET 520')時,後者會崩潰(同時在Word中選擇此打印機)。
  • 編寫一個像這樣的printername:lPrintSetup.Printer := PRINTER_INFO_2.pPrinterName + ' on ' + PRINTER_INFO_2.pPortname。似乎總是工作!但是,搜索結果顯示'on'是本地化的,所以我不確定這是否會在非英文版Windows上運行。 編輯:並不總是工作:(

另一種解決方案我在網上找到:

當從Word閱讀打印機名稱有「的形式PRINTERNAME上Ne01:」,其中Ne01範圍是從Ne00到Ne99:解決方案建議使用printername,並在從Ne00循環到Ne99時試着設置它:當.Execute沒有崩潰時,你已經得到了正確的。我不是很喜歡這個'跟蹤和錯誤'的方法

回答

0

我想通了。 Word的「Printername on NE01:」形式的printername。 Ne01:是devices section of win.ini中指定的打印機端口。所以現在我編寫printername作爲_PRINTER_INFO_2.pPrinterName + ' on ' + <PrinterPort from win.ini>併爲FilePrintSetup對話框的打印機屬性設置該名稱。

這比使用我的問題中提到的追蹤和錯誤方法要好得多。

+0

你不是說因爲本地化的「on」,你不想這樣做嗎? – 2009-09-02 09:34:12

0

我不確定你是否試過這個,或者它有什麼用處,但是你可以從Pr獲得系統上所有打印機的列表inter.Printers對象確保您將打印機添加到您的單位的使用條款。

然後這應該列出系統上的實際名稱,並且您可以使用此信息來執行您想要的操作。

0

如上所述,您可以使用Printer.Printers獲取打印機名稱列表,該打印機名稱是TStringList,每個項目上都有打印機的名稱。

該代碼給出了默認的打印機名稱

Printer.Printers[Printer.PrinterIndex] 
0

有些分鐘前我才知道,那word2k不僅要像Printernames「上Ne01 PRINTERNAME:」只希望端口(NEnn)大寫的「關於NE01 PRINTERNAME :「

+0

我在Word 2000上測試過,它也接受了「Ne00:」。 – 2009-08-27 21:42:42