2009-08-05 71 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