Delphi 通过自动化在MS Word中设置正确的打印机

Delphi 通过自动化在MS Word中设置正确的打印机,delphi,printing,automation,ms-word,Delphi,Printing,Automation,Ms Word,我有以下自动化代码: lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup); lPrintSetup.Printer := 'MyPrinter'; lPrintSetup.DoNotSetAsSysDefault := True; lPrintSetup.Execute; lPrintSetup := Null; 打印机属性给我带来了一些问题,有时执行崩溃,出现EOleException 0x8

我有以下自动化代码:

lPrintSetup := fWordObject.Application.Dialogs.Item(wdDialogFilePrintSetup);
lPrintSetup.Printer := 'MyPrinter';
lPrintSetup.DoNotSetAsSysDefault := True;
lPrintSetup.Execute;
lPrintSetup := Null;
打印机属性给我带来了一些问题,有时执行崩溃,出现EOleException 0x800A1460错误代码5216:打印机名称错误导致打印机错误

通过EnumPrinters API调用获得的_printer_INFO_2记录中有所有打印机的打印机信息。如果打印机信息2记录中有信息,如何为Word编写正确的打印机名称?它至少与Windows 2000、Word 2000和Citrix配合使用

一些背景信息:

我们的应用程序首先使用自建的Printername填充Printername。这给Citrix客户端带来了问题,因此对于Citrix客户端,我们使用了_PRINTER_INFO_2.pPortName并删除了Client::part。 这适用于我们的大多数客户,但有时仍会出现打印机错误

到目前为止,我在Windows XP SP3、Word 2007上尝试的内容:

只需使用_PRINTER_INFO_2.pPrinterName。问题是,当您有意将“PDFCreator”重命名为“HP DESKJET 520 on MYPC”而修改打印机名称时,在Word works中选择此打印机时,后者会崩溃。 按如下方式组合打印机名称:lPrintSetup.Printer:=打印机\u INFO\u 2.ppintername+'on'+打印机\u INFO\u 2.pPortname。似乎总是有用的!但谷歌搜索显示“on”是本地化的,所以我不确定这是否适用于非英语的Windows版本。编辑:不总是有效: 我在网上找到的另一个解决方案是:


从Word读取printername时,它在Ne01:上的形式为printername,其中Ne01的范围为Ne00:到Ne99:。解决方案建议使用printername,并在从Ne00:循环到Ne99:时尝试设置它。当.Execute没有崩溃时,您找到了正确的一个。我不太喜欢这种“跟踪并出错”的方法。

我不确定您是否尝试过这种方法,或者它是否有任何用处,但您可以从打印机中获得系统上所有打印机的列表。打印机对象请确保将打印机添加到单元的Uses子句中


然后,这将列出系统上的实际名称,您可以使用此信息执行所需操作。

如上所述,您可以使用printer.Printers获得打印机名称列表,它是一个TStringList,每个项目上都有打印机名称

此代码提供默认打印机名称

Printer.Printers[Printer.PrinterIndex]

几分钟前,我了解到word2k不仅需要像Ne01上的Printername那样的Printername:它只需要Ne01上的port NEnn大写Printername:

我想出来了。Word在NE01上的printername格式为printername:。Ne01:是中指定的打印机端口。现在,我将printername组合为_PRINTER_INFO_2.pPrinterName+“on”+,并为FilePrintSetup对话框的PRINTER属性设置该名称


这比使用我问题中提到的跟踪和错误方法要好得多。

你不是说你不想这样做是因为本地化的on吗?我在荷兰Windows Vista商业版上测试了这一点,但on没有本地化,所以我冒了险。我确实尝试过将新代码包装起来,但如果失败,我会回到以前分配打印机的方法。